【问题标题】:What's the difference between NSString *s = @"string" and NSString *s = [[NSString alloc] initWithString:@"string"]?NSString *s = @"string" 和 NSString *s = [[NSString alloc] initWithString:@"string"] 有什么区别?
【发布时间】:2012-01-27 13:37:03
【问题描述】:

我认为这个问题很清楚,但仍然 - 有什么区别:

NSString *string = @"Hello world!";

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

如果this 已经回答,请告诉我。

【问题讨论】:

  • 对另一篇文章的引用不一样,因为这个问题是关于常量字符串的。

标签: objective-c cocoa


【解决方案1】:
NSString *string = [[NSString alloc] initWithString:@"Hello world!"];

根据 cocoa 作为 cocoa 命名约定,您使用名称以“alloc”、“new”、“copy”或“mutableCopy”开头的方法创建对象。这意味着您拥有上面的字符串,因此您有责任释放该对象。

NSString *string = @"Hello World";

上面的行是一个字符串文字/常量,你不要分配它或释放它。您不拥有此对象。

【讨论】:

  • 实际上在这种情况下,由于编译器“智能”,实际上没有区别。字符串常量具有非常大的引用计数 (MAXINT),编译器会将第二个示例与第一个示例相同。
  • 有兴趣知道,你真的知道我在哪里可以阅读更多关于这个的信息吗?干杯。
  • 那么,如果我不拥有字符串文字,这是否意味着它会在整个应用执行过程中存在?
  • 是的,文字字符串被编译成二进制文件并在执行应用程序的整个生命周期内持续存在。
  • @Zaph:不完全是。对于每个代码示例,编译器都会按照它所说的那样做;第一个示例确实会创建一个字符串对象并尝试使用文字字符串对其进行初始化。字符串对象可以通过释放自身并返回字符串来响应initWithString:。 (这可能不会发生在 NSMutableString 上。)所以结果如你所说:前一个代码最终将文字字符串分配给变量。但机制不是:新的额外字符串对象的创建仍然发生,但它在分配之前被丢弃。
【解决方案2】:

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

这段代码创建了一个强引用,变量将被保留。然后它分配值“Hello World!”给它。

NSString *string = @"Hello World!";

此代码只是分配值“Hello World!”到 NSString 对象。它不会创建任何类型的任何引用。如果您的对象尚未初始化和保留,则该对象将在运行范围结束时被销毁。

【讨论】:

    猜你喜欢
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    相关资源
    最近更新 更多