【问题标题】:iPhone Dev - NSString CreationiPhone 开发 - NSString 创建
【发布时间】:2010-11-15 16:03:55
【问题描述】:

我真的对 NSStrings 感到困惑。比如我应该什么时候做

NSString *aString = @"Hello";

应该是:

NSString *aString = [[NSString alloc] initWithString:@"Hello"];

但是,当您为 NSString 属性分配值时,情况会有所不同,不是吗? 有人可以帮我解决这个问题吗?

谢谢!!

【问题讨论】:

    标签: iphone cocoa-touch string nsstring creation


    【解决方案1】:

    一般来说你应该做第一个,但它们在功能上大部分是相同的。你可以像对待普通的 NSString 字符串对象一样对待常量 NSStrings,例如:

    [@"Hello" length]
    

    将返回 5。您可以将它们分配给属性,一切正常。您可能会注意到的一件事是,使用常量 NSStrings 您不必担心保留/释放。那是因为它们实际上被映射到应用程序的只读数据部分,并且没有分配内存。保留和释放针对它们的调用仍然有效,它们只是变成了废话。

    【讨论】:

    • 好的,但是说我想格式化它,我需要分配 initWithFormat(或 stringWithFormat 自动释放方法)对吗?
    • 是的,因为您通过格式生成的字符串不是恒定的,它是在运行时动态创建的。
    【解决方案2】:
    NSString *aString = @"Hello";
    

    将创建一个autoreleased 字符串。也就是说,如果您没有明确地retain 它,它可能会在您的方法结束后消失(有时这完全没问题)。但是,如果您想在那个时间之后保留它,则需要保留它。

    如果你像这样为那个字符串创建一个属性

    @property (retain) NSString *aString;
    

    然后像这样分配:

    self.aString = @"Hello";
    

    那么你已经正确地保留了字符串并且它会一直存在。

    另一方面,使用 alloc, init 将为您创建一个保留计数为 1 的字符串,如果您在该方法之后不需要它,您应该 release 它。

    ****编辑:@"Hello" 不是自动释放的字符串,正如其他人指出的那样。我的错。 ****

    【讨论】:

    • 这是不正确的。你不需要保留一个常量 NSString。它不是自动创建的,它是 NSString 类簇的一个特殊子类,它不分配任何内存,因为它被映射到程序的只读页面。
    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    相关资源
    最近更新 更多