- (nullable id)myObjectAtIndex:(NSUInteger)index{
@autoreleasepool {
id value = nil;
if (index < self.count)
{
value = [self myObjectAtIndex:index];
}
return value;
}
}
我不知道在这里使用autoreleasepool的目的。有人可以帮我吗?
答案 0 :(得分:1)
除非我想念所有可能的明显现象,否则我们只能猜测:
有一堆自动释放池,堆栈的顶部是正在使用的池。输入@autoreleasepool { ... }
构造后,会创建一个新的池并将其推入堆栈,退出构造时,池会耗尽并从堆栈中弹出。
NSAutoReleasePool
文档(添加了强调)中给出了创建本地池的原因:
Application Kit在事件循环的每个循环的开始在主线程上创建一个自动释放池,并在结束时将其耗尽,从而释放在处理事件时生成的任何自动释放对象。因此,如果您使用Application Kit,则通常不必创建自己的池。 但是,如果您的应用程序在事件循环中创建了许多临时的自动释放对象,则创建“本地”自动释放池以帮助最大程度地减少峰值内存占用可能是有益的。
那么您正在查看的代码的目的是什么?一些猜测:
原始作者都知道/相信被调用的方法count
和objectAtIndex
(在麻烦过后)向自动释放池添加了大量对象,并希望清理这些对象;或
原始作者正在/计划将未来的代码添加到myObjectAtIndex
中,这将为自动释放池添加大量对象,并希望对其进行清理。或
希望能够调用objectAtIndex
并确保对用于活动对象的内存没有影响(例如,它们可能正在衡量其他对象的内存使用情况);或
谁知道,接受原始作者(希望如此!)
HTH
答案 1 :(得分:1)
没有科学的理由。
整个代码是“此应用程序崩溃且我不知道为什么”紧急代码的示例:
很显然,作者在保证正确的索引方面存在问题,这将是正确的方法。因此,他写了一种特殊的方法来“修复”它。命名(“我的”)表明,他认为:我可以做得更好(而不是确保正确的索引)。
此外,在一段代码中添加ARP显然不会创建更多的对象,这是一个事实的肯定信号,那就是他无法再监视他的代码了。
将整个代码移至/ dev / null。