【问题标题】:Usage of autorelease pool in objectAtindex swizzling for NSMutableArray在 objectAtindex swizzling for NSMutableArray 中使用自动释放池
【发布时间】:2018-11-13 05:51:27
【问题描述】:
- (nullable id)myObjectAtIndex:(NSUInteger)index{
    @autoreleasepool {
        id value = nil;
        if (index < self.count)
        {
            value = [self myObjectAtIndex:index];
        }
        return value;
    }

}

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

【问题讨论】:

  • 调配一个经常使用的 Foundation 方法?那里的代码足以让我怀疑整个代码库是完整的,完全是垃圾,真的需要重写

标签: objective-c nsmutablearray swizzling


【解决方案1】:

除非我错过了显而易见的东西,这总是可能的,我们只能猜测:

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

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

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

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

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

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

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

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

HTH

【讨论】:

  • 谁知道呢,接受原作者(希望如此!)我敢打赌,他没有。
【解决方案2】:

没有科学依据。

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

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

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

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

【讨论】:

  • 可能有点苛刻。如果你用不存在的键索引字典,你会得到nil,如果你用不存在的索引索引数组,你会得到一个错误——这并不完全一致。现有的代码修复了这种不一致,所以也许作者只是比你更喜欢一致性。 (这并不能解释自动释放池,但这是一个不同的问题。)
  • 这是关于一致性的。如果您有两次类似的情况,您可以期待一致性。索引是一个封闭的范围。数组用于索引访问。如果选择使用数组,则选择处理索引。字典没有封闭的值范围。那是为了。如果你选择一个字典,你就不会选择一个封闭的范围,并且必须在访问级别上处理它。
  • 我没有说,数组的键范围是固定的。我说它是关闭的,因此一个简单的数字描述了所有有效的键。这不适用于字典。 这个就是我讲的区别。
  • 不,有限和无限这两个词没有出现在我的 cmets 中。
  • 清理了无趣且因此毫无意义的线程。旁观者显然会想到一致性,在这种情况下,他们如何看待两种形式的离散函数的域。我仍然会给原始程序员带来怀疑的好处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 2011-09-17
  • 2012-10-19
  • 1970-01-01
  • 2013-04-18
相关资源
最近更新 更多