【问题标题】:Objective-C: Are all string literals always loaded into memory?Objective-C:所有字符串文字是否总是加载到内存中?
【发布时间】:2011-09-04 00:47:37
【问题描述】:

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. 是否所有字符串文字总是加载到内存中?

【问题讨论】:

  • 为了供当前处理器活动使用,任何数据必须加载到内存中,无论是寄存器还是地址 - 也许这不是问题你想问,你能澄清一下吗?

标签: objective-c ios memory nsstring


【解决方案1】:

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

在您提供的示例中,NSLocalizedString 调用用于Internationalization。这与您提供的字符串无关(内存方面)。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 所以如果所有字符串文字总是加载到内存中,那么在-initWithNibName:bundle: 中设置一次self.title 是有意义的,而不是在-viewDidLoad 中,因为在self.title 中设置nil -viewDidUnload 不会释放任何内存。对吗?
    • 它确实不会释放任何内存。然而,初始化视图控制器通常在viewDidLoad 中完成。库类的init 方法有些脆弱——可能有几个initWithXXX 方法,在某些情况下,系统可能会调用一些你从来不想覆盖的奇异方法,并且不会调用你的初始化代码。跨度>
    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2012-08-12
    • 1970-01-01
    相关资源
    最近更新 更多