【问题标题】:Do I need to release a constant NSString?我需要释放一个常量 NSString 吗?
【发布时间】:2011-04-24 09:36:34
【问题描述】:

我正在阅读内存管理规则到它所说的这一点

- (void)printHello {

    NSString *string;

    string = [[NSString alloc] initWithString:@"Hello"];

    NSLog(@"%@", string);

    [string release];

}

你拥有所有权并且必须释放string,但我对@"Hello" 很好奇。 @" " 是创建的语法,NSString 是一个对象。那这不是泄露了吗?

【问题讨论】:

    标签: objective-c cocoa memory-management nsstring literals


    【解决方案1】:

    @"…"NSString 的文字实例。当编译器看到一个文字字符串时,它会将字符串映射到二进制文件(例如,您的程序)中,并且在加载二进制文件时(例如,当您运行程序时),该字符串可作为 NSString 对象使用。您不必管理文字字符串占用的内存,因为它们是二进制文件的固有部分——它们始终可用,它们永远不会被释放,而且您不必担心管理它们的内存。

    【讨论】:

    • 谢谢,这很有趣。 Apple 文档中是否有任何地方可以阅读此内容?我在 NSString 文档中找不到任何内容。
    • @Nikita 我不确定这在哪里记录。我个人注意到,当我检查文字字符串的引用计数时,它返回了NSUIntegerMax。这就是运行时指示对象永远不会被释放的方式。如果我找到任何有关此的文档,我会在这里发布。
    • @Nikita 我还没有找到任何官方信息,但如果你在 Stack Overflow 上搜索 nsstring retain count 的问题,你会看到与我类似的答案,并由 Apple 人员编写。
    • @Nikita -retainCount 的文档确实说'对于永远不会被释放的对象(即,它们的释放方法什么都不做),此方法应返回 UINT_MAX,如 .'
    【解决方案2】:

    Bavarious 的回答是正确的。对于好奇的人,我可以补充一点,这在 Apple 的“字符串编程指南”中有记录,特别是“Creating Strings”部分,它说(强调我的):

    在源代码中创建字符串对象的最简单方法是使用 Objective-C 的 @"..." 构造:

    NSString *temp = @"/tmp/scratch";

    请注意,以这种方式创建字符串常量时,您应该使用 UTF-8 字符。 这样的对象是在编译时创建的,并且存在于程序的整个执行过程中。编译器使此类对象常量在每个模块的基础上都是唯一的,并且它们永远不会被释放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 2010-09-24
      • 2010-09-08
      • 2012-01-22
      相关资源
      最近更新 更多