类保留计数
Plenty在此处发布有关避免使用块保留周期的问题,但使用类和类方法时该怎么办?说我有一个这样的类:类保留计数
// MyClass.h
+ (void)doSomethingAsynch:(void (^)(void))block;
+ (void)doSomethingElse;
和呼叫者想这样说:
[MyClass doSomethingAsynch:^{
[MyClass doSomethingElse];
}
必须调用方声明的MyClass的unsafe_unretained副本?或者像一个单身人士一样,不会增加保留数?无论如何,如果我们将班级的保留数量发送到月球,这是否重要?
[[NSObject class] retainCount]
回报NSUIntegerMax
,所以,是的,类实现为单身,可能会覆盖release
作为无操作。
附录:
在NSObject
的objc runtime implementation在行1659你发现......
+ (id)retain {
return (id)self;
}
...这证实了[NSObject retain]
什么都不做。
正如你所建议的,类永远不会被系统解除分配,所以如果你反复保留它们并且永远不释放它们,那么它就不是问题。我的猜测是retain
在一个类别上什么也不做。
您正在将这些方法暴露为静态/类方法(前面的'+'而不是' - ',例如方法),所以当然,如果您只想要此类特定的类,则您无需执行[[MyClass alloc] init]
使用这些方法。由于您没有使用alloc
,因此您不必担心retain
或release
。
这些天,ARC(自动引用计数)你大多不必担心retain
和release
无论如何,它增加了所有在编译时为您服务。
编辑:强调大多,当你仍然需要为有时间担心,还增加了一些清晰度
我认为有人在这里做了-1,因为即使在ARC下,你确实需要担心内存管理。在块中保留循环就是一个例子。 – danh
我试图在我的答案中添加一些清晰的内容,在这种情况下,它与C#中静态方法的静态类相同,仅基于问题中提供的内容。 –
好的谢谢。 +1这里和+ 1 /正确@Nikolai b/c的有用的经验证据类保留计数。 – danh