19

是否没有必要保留一个静态变量,因为它在程序期间一直存在,无论您是否释放它?

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

4

2 回答 2

38

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

这样的变量确实和应用程序一样有生命周期,但我们所说的变量只是指针。在 Objective-C 中,对象总是动态分配的,所以我们总是用指向它们类型的指针来寻址它们,但是对象的底层数据仍然存在于动态分配的野蓝色中。

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

于 2011-06-11T15:28:06.310 回答
17

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

retain不适用于指向对象的变量。该变量永远存在,因为它是静态的。retain是变量指向的对象。没有retain对象可以(并且应该)被释放。然后你有一个变量指向一个会导致sigabrt. 这个不指向任何地方的变量被称为“悬空指针”。

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

static ThatClass * __strong thatStaticVariable;

这确保了thatStaticVariable指向的对象在分配后将是一个有效的对象(即永远不会被释放)。但是,您实际上根本不需要 __strong 关键字,因为它是默认关键字(所以说docs,感谢@zpasternack),所以只需使用

static ThatClass *thatStaticVariable;

你很好。

注意:永远 = 应用程序运行时

于 2011-10-26T04:40:12.133 回答