Objective c 自动释放池在NSMutableArray对象索引swizzling中的使用 -(可空id)myObjectAtIndex:(nsInteger)索引{ @自动释放池{ id值=零; 如果(索引

Objective c 自动释放池在NSMutableArray对象索引swizzling中的使用 -(可空id)myObjectAtIndex:(nsInteger)索引{ @自动释放池{ id值=零; 如果(索引,objective-c,nsmutablearray,swizzling,Objective C,Nsmutablearray,Swizzling,我不知道在这里使用autoreleasepool的目的。有人能帮我一把吗?除非我忽略了显而易见的事情,这总是可能的,否则我们只能猜测: 有一个自动释放池堆栈,堆栈顶部是正在使用的池。当进入@autoreleasepool{…}构造时,将创建一个新的池并将其推送到堆栈上,在退出该构造时,该池将被排空并从堆栈中弹出 创建本地池的原因在NSAutoReleasePool文档中给出(重点添加): 应用程序工具包在事件循环的每个周期开始时在主线程上创建一个自动释放池,并在结束时将其耗尽,从而释放在处理事件

我不知道在这里使用autoreleasepool的目的。有人能帮我一把吗?

除非我忽略了显而易见的事情,这总是可能的,否则我们只能猜测:

有一个自动释放池堆栈,堆栈顶部是正在使用的池。当进入
@autoreleasepool{…}
构造时,将创建一个新的池并将其推送到堆栈上,在退出该构造时,该池将被排空并从堆栈中弹出

创建本地池的原因在
NSAutoReleasePool
文档中给出(重点添加):

应用程序工具包在事件循环的每个周期开始时在主线程上创建一个自动释放池,并在结束时将其耗尽,从而释放在处理事件时生成的所有自动释放对象。因此,如果使用应用程序工具包,通常不必创建自己的池。但是,如果您的应用程序在事件循环中创建了大量临时自动释放对象,那么创建“本地”自动释放池可能会有助于最小化峰值内存占用

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

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

  • 原作者曾/正计划将未来代码添加到
    myObjectAtIndex
    ,这将向自动释放池添加大量对象,并希望清理这些对象;或

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

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


HTH

除非我忽略了显而易见的东西,这总是可能的,否则我们只能猜测:

有一个自动释放池堆栈,堆栈顶部是正在使用的池。当进入
@autoreleasepool{…}
构造时,将创建一个新的池并将其推送到堆栈上,在退出该构造时,该池将被排空并从堆栈中弹出

创建本地池的原因在
NSAutoReleasePool
文档中给出(重点添加):

应用程序工具包在事件循环的每个周期开始时在主线程上创建一个自动释放池,并在结束时将其耗尽,从而释放在处理事件时生成的所有自动释放对象。因此,如果使用应用程序工具包,通常不必创建自己的池。但是,如果您的应用程序在事件循环中创建了大量临时自动释放对象,那么创建“本地”自动释放池可能会有助于最小化峰值内存占用

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

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

  • 原作者曾/正计划将未来代码添加到
    myObjectAtIndex
    ,这将向自动释放池添加大量对象,并希望清理这些对象;或

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

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


没有科学的理由

整个代码是“此应用程序崩溃,我不知道为什么”恐慌代码的一个示例:

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

此外,在一段代码中添加ARP显然不会创建更多的对象,这是一个明确的迹象,表明他无法再监督他的代码了


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

没有科学原因

整个代码是“此应用程序崩溃,我不知道为什么”恐慌代码的一个示例:

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

此外,在一段代码中添加ARP显然不会创建更多的对象,这是一个明确的迹象,表明他无法再监督他的代码了


把整个代码移到/DEV/NULL。

谁知道,接受原作者(希望!)我会打赌,他不知道。谁知道,接受原作者(希望!)我敢打赌,他没有。那个代码,就在那里,足以让我怀疑整个代码库是完整的和真正需要重写的真正的垃圾。这段代码,就在那里,足以让我怀疑整个代码库是完整的,完全是垃圾,真的需要重写。可能有点苛刻。如果用一个不存在的键对字典进行索引,则返回
nil
,如果对arra进行索引
- (nullable id)myObjectAtIndex:(NSUInteger)index{
    @autoreleasepool {
        id value = nil;
        if (index < self.count)
        {
            value = [self myObjectAtIndex:index];
        }
        return value;
    }

}