是否不必保留静态变量,因为它在程序的持续时间内保持不变,无论你是否释放它?
答案 0 :(得分:38)
我假设你指的是一个静态对象指针,例如static NSString *foobar;
。
这些变量确实具有生命周期,只要应用程序,但我们所讨论的变量只是指针。在Objective-C中,对象总是被动态分配,因此我们总是使用指向其类型的指针来解决它们,但是对象的基础数据仍然存在于动态分配的泛蓝色的yonder中。
您仍然必须保留该对象,因为当对象的指针永远不会超出范围时,对象本身可以像任何其他对象一样被释放,因此您的指针将会结束指向垃圾,或更糟糕的是,另一个不相关的对象。
答案 1 :(得分:16)
Jonathan Grynspan接受答案的简化版本:
retain
不适用于指向对象的变量。该变量将永久持续,因为它是静态的。 retain
用于变量指向的对象。如果没有retain
,则可以(并且应该)取消分配对象。然后你有一个变量指向一个会导致sigabrt
的事物。这个无处指向的变量被称为“悬空指针”。
对于ARC上下文,最好的办法是将静态变量声明为强,如下所示:
static ThatClass * __strong thatStaticVariable;
这确保了thatStaticVariable
指向的对象一旦被分配就将成为有效对象(即永远不会被释放)。 但是,你实际上根本不需要__strong关键字,因为它是默认的(所以说the docs,感谢@zpasternack),所以只需使用
static ThatClass *thatStaticVariable;
你很好。
注意:forever =在应用程序运行时