注意:我的问题与此无关。
除了在声明它的文件之外看不到变量之外,就内存分配而言,声明它(在方法之外)有什么区别:
NSString *const kMyConstant = @"Hello World";
或这个:
static NSString *const kMyConstant = @"Hello World";
注意:我的问题与此无关。
除了在声明它的文件之外看不到变量之外,就内存分配而言,声明它(在方法之外)有什么区别:
NSString *const kMyConstant = @"Hello World";
或这个:
static NSString *const kMyConstant = @"Hello World";
在内存分配方面,不,没有区别。两个变量都是指向同一个字符串常量的指针,都被分配一次,在这两种情况下,它们的生命周期就是程序的生命周期。
不,没有,它只会影响编译单元外对象的可见性。
这也可以通过以下方式实现:
__attribute__ ((visibility ("hidden")) NSString *const kMyConstant = @"Hello World";
编辑那是补鞋匠;该visibility hidden
属性影响共享对象之外的可见性,而不是编译单元。
我认为这是一个非常有趣的问题,因为它一方面显示了对常量的一些清晰易懂的管理,并且在处理 NSString 类常量时,Objective C 和 clang 包含了一些明显的异常。
我相信以下内容确实适用:
问题中的上述声明和初始化对内存管理没有影响。简单的并不存在。常量只是简单地包含在包中,而不是按照经典术语分配。这意味着来自对象类的值指向字符串常量所在的捆绑内存位置。在比较此类 NSString 及其对象类的地址时,您可以很容易地发现这一点。字符串地址很低,指向捆绑位置地址范围。您可以看到在代码中初始化的其他字符串的地址指向一个非常不同的位置。Objective C 运行时不对字符串常量执行任何类型的内存管理,因为从 bundle 中“释放”或删除某些东西会很尴尬。所以,如果你在非 ARC 环境中玩这个,
通过回答这个问题来结束这一点:不,在这两种情况下管理内存没有任何区别。它根本没有完成。内存由捆绑分配,并在应用程序结束时由操作系统释放。它不仅适用于实现之外的声明和分配显式常量,也适用于任何方法内部。
它确实与上述两个表达式有所不同,当您声明具有静态范围的变量时,它会在重复调用时保留其分配的值,这在某些情况下有利于性能,但是它有一个缺点,因为分配了静态变量的内存一次并在整个程序中一直呆在那里,直到应用程序完成。此外,释放静态定义的变量非常困难。在应用程序完成之前,它永远不会释放内存,并且您将冒着使用大量内存的风险,而 ARC 在这里无法为您提供帮助。