Jon*_*pan 38

我假设你的意思是一个静态对象指针,如static NSString *foobar;.

这些变量确实具有生命周期,只要应用程序,但我们所讨论的变量只是指针.在Objective-C中,对象总是被动态分配,因此我们总是使用指向其类型的指针来解决它们,但是对象的基础数据仍然存在于动态分配的泛蓝色yonder中.

您仍然必须保留该对象,因为虽然指向该对象的指针永远不会超出范围,但对象本身可以像任何其他对象一样被释放,因此您的指针最终将指向垃圾,或者更糟糕的是,另一个不相关的对象.

  • 乔纳森是对的!如果传递的参数是在自动释放池中并且在调用该方法后将自动释放怎么办? - >访问静态指针会导致失败(主要是EXEC_BAD_ACCESS) (4认同)

Dan*_*ark 17

Jonathan Grynspan的简化版本接受了答案:

retain不是为变量指向的对象.该变量永远持续下去,因为它是静态的.的retain是该对象的变量指向.没有该retain对象可以(并且应该)被解除分配.然后你有一个变量指向一个会导致a的东西sigabrt.这个指向无处的变量被称为"悬空指针".

对于ARC上下文,最好的做法是将静态变量声明为强,如下所示:

static ThatClass * __strong thatStaticVariable;
Run Code Online (Sandbox Code Playgroud)

这确保了thatStaticVariable一旦指定,指向的对象将成为有效对象(即永远不会被释放).但是,你根本不需要__strong关键字,因为它是默认的(所以说文档,感谢@zpasternack),所以只需使用

static ThatClass *thatStaticVariable;
Run Code Online (Sandbox Code Playgroud)

而且你很好.

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

  • 在ARC下,任何没有明确所有权限定符的可保留对象都是__strong,所以说[文档](http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.inference). (5认同)