为啥要保留静态变量?

Posted

技术标签:

【中文标题】为啥要保留静态变量?【英文标题】:Why retain a static variable?为什么要保留静态变量? 【发布时间】:2011-09-13 02:08:15 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

static ThatClass * __strong thatStaticVariable;

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

static ThatClass *thatStaticVariable;

你很好。

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

【讨论】:

在 ARC 下,任何没有明确所有权限定符的可保留对象都是隐式 __strong,所以说 the docs。【参考方案2】:

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

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

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

【讨论】:

乔纳森是对的!如果传递的参数在自动释放池中,并且在方法被调用后会被自动释放怎么办?! -> 访问静态指针会导致失败(主要是EXEC_BAD_ACCESS) Martin,一个小的修正:那是 EXC_BAD_ACCESS(EXC 作为例外)。

以上是关于为啥要保留静态变量?的主要内容,如果未能解决你的问题,请参考以下文章

python 为啥要使用静态方法

java中为啥要把main方法定义为一个static方法

为啥 C# 公共静态变量不需要实例化?

java中为啥说静态方法先执行?

java:在java中为啥静态变量没有this引用?

在java中,为啥类实例也能访问静态域?