【问题标题】:Class retain counts类保留计数
【发布时间】:2013-01-10 21:49:56
【问题描述】:

这里有很多关于避免使用块的保留循环的文章,但是在使用类和类方法时呢?假设我有这样的课程:

// MyClass.h

+ (void)doSomethingAsynch:(void (^)(void))block;
+ (void)doSomethingElse;

来电者想说的是:

[MyClass doSomethingAsynch:^{
    [MyClass doSomethingElse];
}

调用者必须声明 MyClass 的 unsafe_unretained 副本吗?还是像单例这样的类,不会增加它的保留计数?既然我们希望它一直存在,我们是否将类的保留计数发送到月球是否重要?

【问题讨论】:

    标签: ios objective-c singleton retaincount retain-cycle


    【解决方案1】:

    [[NSObject class] retainCount] 返回NSUIntegerMax,所以,是的,类是作为单例实现的,并且可能将release 覆盖为空操作。

    附录:

    在第 1659 行 NSObjectobjc runtime implementation 中,您会发现 ...

    + (id)retain {
        return (id)self;
    }
    

    ... 验证 [NSObject retain] 什么都不做。

    【讨论】:

      【解决方案2】:

      正如你所建议的,类永远不会被系统释放,所以如果你反复保留它们并且从不释放它们就无关紧要了。我的猜测是 retain 在课堂上什么都不做。

      【讨论】:

      • 好的,谢谢。在此处 +1 和在 @Nikolai b/c 上 +1/正确,关于类保留计数的有用经验证据。
      【解决方案3】:

      您将这些方法公开为静态/类方法(前面的“+”而不是实例方法的“-”),所以当然,如果您只需要为这个特定的类执行 [[MyClass alloc] init]想用那些方法。由于您没有使用alloc,因此您不必担心retainrelease

      现在有了 ARC(自动引用计数),您大部分情况下不必担心 retainrelease,它会在编译时为您添加所有这些。

      编辑:强调大部分,因为有时你仍然需要担心它,也增加了一些清晰度

      【讨论】:

      • 我认为有人在这里做了-1,因为即使在 ARC 下,您有时也需要担心内存管理。块中的保留循环就是一个例子。
      • 我试图让我的答案更加清晰,在这种情况下,它与 C# 中具有静态方法的静态类相同,仅基于问题中提供的内容。
      猜你喜欢
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 2011-08-24
      • 2013-10-08
      • 1970-01-01
      相关资源
      最近更新 更多