objective-c - 在 objectAtindex swizzling for NSMutableArray 中使用自动释放池
问题描述
- (nullable id)myObjectAtIndex:(NSUInteger)index{
@autoreleasepool {
id value = nil;
if (index < self.count)
{
value = [self myObjectAtIndex:index];
}
return value;
}
}
我不知道在这里使用 autoreleasepool 的目的。有人可以帮帮我吗?
解决方案
除非我错过了显而易见的事情,这总是可能的,否则我们只能猜测:
有一堆自动释放池,堆栈的顶部是正在使用的池。当@autoreleasepool { ... }
进入该构造时,会创建一个新池并将其压入堆栈,在从该构造退出时,该池将被排空并从堆栈中弹出。
NSAutoReleasePool
文档中给出了创建本地池的原因(强调添加):
Application Kit 在事件循环的每个周期开始时在主线程上创建一个自动释放池,并在结束时将其排出,从而释放在处理事件时生成的所有自动释放对象。如果您使用 Application Kit,您通常不必创建自己的池。但是,如果您的应用程序在事件循环中创建了许多临时自动释放对象,则创建“本地”自动释放池以帮助最小化峰值内存占用可能是有益的。
那么您正在查看的代码的目的是什么?一些猜测:
要么原作者知道/相信被调用的方法
count
并且objectAtIndex
(在 swizzle 之后)将大量对象添加到自动释放池并希望清理这些对象;或者原作者曾经/正在计划添加将来的代码,
myObjectAtIndex
这些代码将向自动释放池中添加大量对象并希望清理这些对象;或者希望能够调用
objectAtIndex
并确保对活动对象使用的内存没有影响(例如,他们可能正在测量其他东西的内存使用情况);或者谁知道,接受原作者(希望如此!)
高温高压
推荐阅读
- javascript - onChange 在 reactjs antd 中使用 setState 时返回一个回调
- apache - 如何用问号重定向链接
- android - 在后台Android中进行繁重处理时UI冻结
- reactjs - 使用来自反应应用程序的 axios 将数据传递给 Web 服务
- python - 如果引发异常,则删除 Django 模型实例
- react-native - 世博联系原生模式
- android - 我的代码抛出错误 [Fatal error: Main] 你能告诉我为什么吗?
- excel - 是否有任何代码可以识别特定单元格(b2)为真,然后将公式替换为另一个单元格(i2)?
- objective-c - 使用目标 c 将字符串转换为 ByteArray
- linux - 虚拟主机的 crontab