为什么要保留静态变量?

时间:2011-06-11 15:22:21

标签: objective-c memory-management retain static-variables

是否不必保留静态变量,因为它在程序的持续时间内保持不变,无论你是否释放它?

查看此代码: https://github.com/magicalpanda/MagicalRecord/blob/master/Source/Categories/NSManagedObjectContext+MagicalRecord.m#L24-29

2 个答案:

答案 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 =在应用程序运行时