首页 > 解决方案 > 在 objectAtindex swizzling for NSMutableArray 中使用自动释放池

问题描述

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

}

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

标签: objective-cnsmutablearrayswizzling

解决方案


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

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

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

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

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

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

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

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

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

高温高压


推荐阅读