在目标中使用静态

注意:我的问题与此无关。

除了在文件外部看不到的变量之外, 就内存分配而言 ,声明这个(在方法之外)是有区别的:

NSString *const kMyConstant = @"Hello World";

或这个:

static NSString *const kMyConstant = @"Hello World";

在内存分配方面,不,没有区别。 两个变量都是指向相同字符串常量的指针,两者都分配一次,并且在这两种情况下,它们的生命周期都是程序的生命周期。


不,它不会影响编译单元之外的对象的可见性。

这也可以通过以下方式实现:

__attribute__ ((visibility ("hidden")) NSString *const kMyConstant = @"Hello World";

编辑这是修鞋匠; visibility hidden属性影响共享对象之外的可视性,而不影响编译单元。


我认为这是一个非常有趣的问题,因为它一方面显示了一些清晰易懂的常量管理,另一方面显示了Objective C和clang在处理NSString类常量时包含的一些明显的异常。

我相信以下内容适用于:

上面的声明和初始化对于内存管理没有任何影响。 它简单并不存在。 常量只包含在捆绑包中,并不以经典术语分配。 意思是来自对象类的值指向字符串常量所在的包内存位置。 当比较这样的NSString和它的对象类的地址时,你可以很容易地找到它。 字符串地址非常低,指向包位置地址范围。 您可以看到在代码中初始化的其他字符串的地址指向了非常不同的位置。 Objective C运行时不对字符串常量执行任何类型的内存管理,因为从bundle中“释放”或删除某些内容会非常尴尬。 所以,如果你在非ARC环境中玩这个游戏,你会看到保留和释放被忽略。

通过回答这个问题来结束这个问题:不,在两种情况下管理内存没有任何区别。 这根本就没有完成。 内存由bundle分配,当应用程序结束时由OS释放。 它不仅适用于声明并在实现之外分配显式常量,而且也适用于任何方法。

链接地址: http://www.djcxy.com/p/73959.html

上一篇: Use of Static in Objective

下一篇: Django migrate model with user in a foreignkey fails