2

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

// MyClass.h

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

来电者想说:

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

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

4

3 回答 3

4

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

附录:

在第 1659 行的objc 运行时实现NSObject,您会发现...

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

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

于 2013-01-10T22:16:53.877 回答
2

正如您所建议的,类永远不会被系统释放,因此如果您反复保留它们并且从不释放它们,这并不重要。我的猜测是retain在课堂上什么都不做。

于 2013-01-10T21:52:47.840 回答
-1

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

现在有了 ARC(自动引用计数),您几乎不必担心retainrelease无论如何,它会在编译时为您添加所有这些。

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

于 2013-01-10T22:08:57.463 回答