ma1*_*w28 18 memory-management objective-c static-variables retain
是不是不必保留静态变量,因为它在程序的持续时间内保持不变,无论你是否释放它?
请参阅此代码:https: //github.com/magicalpanda/MagicalRecord/blob/master/Source/Categories/NSManagedObjectContext+MagicalRecord.m#L24-29
Jon*_*pan 38
我假设你的意思是一个静态对象指针,如static NSString *foobar;
.
这些变量确实具有生命周期,只要应用程序,但我们所讨论的变量只是指针.在Objective-C中,对象总是被动态分配,因此我们总是使用指向其类型的指针来解决它们,但是对象的基础数据仍然存在于动态分配的泛蓝色yonder中.
您仍然必须保留该对象,因为虽然指向该对象的指针永远不会超出范围,但对象本身可以像任何其他对象一样被释放,因此您的指针最终将指向垃圾,或者更糟糕的是,另一个不相关的对象.
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 =在应用程序运行时