自动释放池在NSMutableArray的objectAtindex泛滥中的使用

时间:2018-11-13 05:51:28

标签: objective-c nsmutablearray swizzling

- (nullable id)myObjectAtIndex:(NSUInteger)index{
    @autoreleasepool {
        id value = nil;
        if (index < self.count)
        {
            value = [self myObjectAtIndex:index];
        }
        return value;
    }

}

我不知道在这里使用autoreleasepool的目的。有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

除非我想念所有可能的明显现象,否则我们只能猜测:

有一堆自动释放池,堆栈的顶部是正在使用的池。输入@autoreleasepool { ... }构造后,会创建一个新的池并将其推入堆栈,退出构造时,池会耗尽并从堆栈中弹出。

NSAutoReleasePool文档(添加了强调)中给出了创建本地池的原因:

  

Application Kit在事件循环的每个循环的开始在主线程上创建一个自动释放池,并在结束时将其耗尽,从而释放在处理事件时生成的任何自动释放对象。因此,如果您使用Application Kit,则通常不必创建自己的池。 但是,如果您的应用程序在事件循环中创建了许多临时的自动释放对象,则创建“本地”自动释放池以帮助最大程度地减少峰值内存占用可能是有益的。

那么您正在查看的代码的目的是什么?一些猜测:

  • 原始作者都知道/相信被调用的方法countobjectAtIndex(在麻烦过后)向自动释放池添加了大量对象,并希望清理这些对象;或

  • 原始作者正在/计划将未来的代码添加到myObjectAtIndex中,这将为自动释放池添加大量对象,并希望对其进行清理。或

  • 希望能够调用objectAtIndex并确保对用于活动对象的内存没有影响(例如,它们可能正在衡量其他对象的内存使用情况);或

  • 谁知道,接受原始作者(希望如此!)

HTH

答案 1 :(得分:1)

没有科学的理由。

整个代码是“此应用程序崩溃且我不知道为什么”紧急代码的示例:

很显然,作者在保证正确的索引方面存在问题,这将是正确的方法。因此,他写了一种特殊的方法来“修复”它。命名(“我的”)表明,他认为:我可以做得更好(而不是确保正确的索引)。

此外,在一段代码中添加ARP显然不会创建更多的对象,这是一个事实的肯定信号,那就是他无法再监视他的代码了。

将整个代码移至/ dev / null。