如果静态变量在程序运行期间一直存在,无论是否释放它,保留它不是多余的吗?
如果静态变量在程序运行期间一直存在,无论是否释放它,保留它不是多余的吗?
我假设你指的是静态对象指针,比如 static NSString *foobar;
。
这样的变量确实有着应用程序生命周期那么长的寿命,但我们所谈论的变量仅仅是指针。在Objective-C中,对象总是动态分配的,因此我们总是用指向它们类型的指针来寻址,但对象的基础数据仍然存在于动态分配的内存中。
你仍然必须保留对象,因为虽然指针永远不会超出作用域,但对象本身可以像任何其他对象一样被释放,因此你的指针最终会指向垃圾,更糟糕的是,指向另一个无关的对象。
Jonathan Grynspan的答案已经被简化:
retain
并不是针对指向对象的变量。由于它是静态的,因此该变量将永远存在。 retain
实际上是为了指向的对象。如果没有retain
,对象可能会被释放,这时你就会得到一个指向"悬空指针"的变量,导致程序崩溃(sigabrt)。
对于ARC环境,最好的做法是将静态变量声明为strong类型,所以代码应该像这样:
static ThatClass * __strong thatStaticVariable;
这确保了thatStaticVariable
指向的对象在分配后将是有效的对象(即永远不会被释放)。然而,实际上你完全不需要使用__strong关键字,因为它是默认的(根据文档,感谢@zpasternack),所以只需使用
static ThatClass *thatStaticVariable;
而且你做得很好。
注意:forever = 当应用程序正在运行时