2013-01-10 70 views
2

Plenty在此处发布有关避免使用块保留周期的问题,但使用类和类方法时该怎么办?说我有一个这样的类:类保留计数

// MyClass.h 

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

和呼叫者想这样说:

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

必须调用方声明的MyClass的unsafe_unretained副本?或者像一个单身人士一样,不会增加保留数?无论如何,如果我们将班级的保留数量发送到月球,这是否重要?

回答

4

[[NSObject class] retainCount]回报NSUIntegerMax,所以,是的,类实现为单身,可能会覆盖release作为无操作。

附录:

NSObjectobjc runtime implementation在行1659你发现......

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

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

2

正如你所建议的,类永远不会被系统解除分配,所以如果你反复保留它们并且永远不释放它们,那么它就不是问题。我的猜测是retain在一个类别上什么也不做。

+0

好的谢谢。 +1这里和+ 1 /正确@Nikolai b/c的有用的经验证据类保留计数。 – danh

-1

您正在将这些方法暴露为静态/类方法(前面的'+'而不是' - ',例如方法),所以当然,如果您只想要此类特定的类,则您无需执行[[MyClass alloc] init]使用这些方法。由于您没有使用alloc,因此您不必担心retainrelease

这些天,ARC(自动引用计数)你大多不必担心retainrelease无论如何,它增加了所有在编译时为您服务。

编辑:强调大多,当你仍然需要为有时间担心,还增加了一些清晰度

+0

我认为有人在这里做了-1,因为即使在ARC下,你确实需要担心内存管理。在块中保留循环就是一个例子。 – danh

+0

我试图在我的答案中添加一些清晰的内容,在这种情况下,它与C#中静态方法的静态类相同,仅基于问题中提供的内容。 –