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

3
UIViewController子类中,我经常看到以下写法:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = NSLocalizedString(@"Home", nil);
    }
    return self;
}
  1. 为什么不能在 -viewDidLoad 方法中设置 self.title

  2. 所有字符串字面量都会被加载到内存中吗?


1
为了被当前处理器活动使用,任何数据片段必须被加载到内存中,可以是寄存器或地址 - 或许这不是你想要问的问题,你能澄清一下吗? - Russ Clarke
2个回答

7
一般来说,字符串字面量是编译后的Mach-O文件中数据部分的一部分。由于执行时所有代码都会被"加载到内存"中,这意味着字符串字面量也会被加载到内存中。尽管如此,最好像处理其他对象一样保留/释放字符串,即使你知道它们将成为字面值。
在您提供的示例中,NSLocalizedString调用是用于国际化。这与您提供的字符串(从内存方面)无关。

4
字符串字面量被编译进你的可执行文件中,它们不是资源。它们被保存在可执行文件中初始化的静态数据段中。因此,基本上当可执行文件被加载时,无论何时程序正在运行,它们都在内存中。
但是,有分页机制。有时,当内存不足时,系统可能会将你正在运行的可执行文件的某些部分从内存中释放出来,以便释放一些空间,并在需要时重新加载它们。这个过程是自动的、透明的和不可预测的。因此,有少许可能在某些时间点上字符串不会物理存在于内存中,但一旦你尝试访问它,它就会神奇地出现在那里。任何分页操作都不是基于每个字符串的,而是以4-8 KB(“页面”)为单位进行的。

如果所有字符串字面量都始终加载到内存中,那么在-initWithNibName:bundle:中设置self.title一次而不是在-viewDidLoad中设置是有意义的,因为在-viewDidUnload中将self.title设置为nil不会释放任何内存。正确吗? - ma11hew28
它实际上不会释放任何内存。然而,初始化视图控制器通常在viewDidLoad中完成。库类的init方法有些脆弱 - 可能会有几个initWithXXX方法,在某些情况下,系统可能会调用一些你从未关心过的奇特方法,你的初始化代码将不会被调用。 - Seva Alekseyev
没错,但对于 UIViewController, -initWithNibName:bundle: 来说,它是指定的初始化方法 - ma11hew28

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接