为啥要保留静态变量?
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 作为例外)。以上是关于为啥要保留静态变量?的主要内容,如果未能解决你的问题,请参考以下文章