为什么要保留静态变量?

19
2个回答

39

我假设你指的是静态对象指针,比如 static NSString *foobar;

这样的变量确实有着应用程序生命周期那么长的寿命,但我们所谈论的变量仅仅是指针。在Objective-C中,对象总是动态分配的,因此我们总是用指向它们类型的指针来寻址,但对象的基础数据仍然存在于动态分配的内存中。

你仍然必须保留对象,因为虽然指针永远不会超出作用域,但对象本身可以像任何其他对象一样被释放,因此你的指针最终会指向垃圾,更糟糕的是,指向另一个无关的对象。


4
乔纳森说得对!如果传递的参数在自动释放池中,并且将在调用方法后自动释放,那该怎么办?! -> 访问静态指针将导致失败(主要是EXEC_BAD_ACCESS)。 - Martin Ullrich
马丁,一个小更正:那应该是EXC_BAD_ACCESS(EXC代表异常)。 - bneely

18

Jonathan Grynspan的答案已经被简化:

retain并不是针对指向对象的变量。由于它是静态的,因此该变量将永远存在。 retain实际上是为了指向的对象。如果没有retain,对象可能会被释放,这时你就会得到一个指向"悬空指针"的变量,导致程序崩溃(sigabrt)。

对于ARC环境,最好的做法是将静态变量声明为strong类型,所以代码应该像这样:

static ThatClass * __strong thatStaticVariable;

这确保了thatStaticVariable指向的对象在分配后将是有效的对象(即永远不会被释放)。然而,实际上你完全不需要使用__strong关键字,因为它是默认的(根据文档,感谢@zpasternack),所以只需使用

static ThatClass *thatStaticVariable;

而且你做得很好。

注意:forever = 当应用程序正在运行时


5
根据文档,在ARC中,任何没有明确指定所有权限定词的可保留对象隐式地被视为 __strong。 - zpasternack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接