![](/img/trans.png)
[英]returning an object retrieved from an NSMutableArray via objectAtIndex - autorelease necessary?
[英]Usage of autorelease pool in 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在事件循环的每个循环的开始在主线程上创建一个自动释放池,并在结束时将其耗尽,从而释放在处理事件时生成的任何自动释放对象。 因此,如果使用应用程序套件,则通常不必创建自己的池。 但是,如果您的应用程序在事件循环中创建了许多临时的自动释放对象,则创建“本地”自动释放池以帮助最大程度地减少峰值内存占用量可能是有益的。
那么,您正在查看的代码的目的是什么? 一些猜测:
原始作者知道/相信被调用的方法count
和objectAtIndex
(在麻烦过后)会在自动释放池中添加大量对象,并希望清理这些对象。 要么
最初的作者正在/计划将未来的代码添加到myObjectAtIndex
,这将在自动释放池中添加大量的对象,并希望清理这些对象。 要么
希望能够调用objectAtIndex
并确保对用于活动对象的内存没有影响(例如,它们可能正在衡量其他对象的内存使用情况); 要么
谁知道,接受原作者(希望!)
高温超导
没有科学的理由。
整个代码是“此应用程序崩溃且我不知道为什么”崩溃示例的示例:
显然,作者在保证正确索引方面存在问题,那将是正确的方法。 因此,他写了一种特殊的方法来“修复”它。 命名(“我的”)表明,他认为:我可以做得更好(而不是确保正确的索引)。
而且,在一段代码中添加ARP显然不会创建更多的对象,这确实证明了他不能再监视自己的代码了。
将整个代码移到/ dev / null。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.