Objective-C:所有字符串文字是否总是加载到内存中?

时间:2011-09-04 00:47:38

标签: objective-c ios memory nsstring

UIViewController子类中,我经常看到:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = NSLocalizedString(@"Home", nil);
    }
    return self;
}
  1. 为什么不在self.title中设置-viewDidLoad

  2. 是否所有字符串文字都被加载到内存中?

2 个答案:

答案 0 :(得分:7)

通常,字符串文字是已编译的Mach-O文件中数据部分的一部分。由于所有代码在执行时都被“加载到内存中”,这意味着字符串文字也总是被加载到内存中。这就是说,保留/释放字符串仍然是一个好主意,就像你对其他对象一样,即使你知道它们将是文字。

在您提供的示例中,NSLocalizedString调用用于Internationalization。这与您提供的字符串无关(记忆明智)。

答案 1 :(得分:4)

字符串文字被编译到您的可执行文件中 - 它们不是资源。它们保存在可执行文件的初始化静态数据部分中。所以是的,在最基本的层面上,无论何时加载可执行文件,它们都在内存中 - 也就是说,无论何时程序运行。

虽然有传呼。 Somtetimes,当内存不足时,系统可能会将部分正在运行的可执行文件从内存中释放出来以释放一些内存,并在需要时重新加载它们。此过程是自动,透明和不可预测的。因此,某个时间点字符串在物理上不存在的可能性很小,但是一旦你尝试访问它,它就会神奇地存在。任何分页都不会在每个字符串的基础上完成 - 它以4-8 KB(“页面”)为单位完成。