@“”与[NSString字符串]

时间:2012-01-11 08:01:52

标签: objective-c

我正试图找出@""[NSString string]的优点和缺点,因为它们似乎以类似的方式表现。我想我希望[NSString string]返回一个静态值,从而避免在内存中创建不必要的字符串。任何人都可以解释一下,因为文件是不确定的。

6 个答案:

答案 0 :(得分:5)

很可能是@"" == [NSString string],因此这个决定只是风格问题。啊哈,不是:

NSLog(@"%i", @"" == @""); // 1
NSLog(@"%i", [NSString string] == [NSString string]); // 1
NSLog(@"%i", [[NSString string] stringByAppendingString:@"foo"] ==
             [@"" stringByAppendingString:@"foo"]); // 1
NSLog(@"%i", @"" == [NSString string]); // 0

但我想不出任何差异很重要的用例。

答案 1 :(得分:2)

@""是一个文字字符串,将在整个应用程序执行期间存在。 [NSString string]可能是一个动态分配的对象(但可能被优化为不是),因此在理论上可以在执行期间收集不再引用的对象。文字字符串和动态分配的字符串都在内部使用共享,因此两个@""或两个[NSString string]可能返回相同的对象 - 即使不在同一个文件中 - 但不能保证它们会。但是,它们可能不会彼此返回相同的对象。

总的来说,没关系,你不应该依赖指针相等来测试字符串相等性。

查看汇编代码我猜@""具有性能优势,但认为重要的是过早优化的情况。

只需使用@"",它具有简短明了的优点。

答案 2 :(得分:1)

我很确定[NSString string]只是[[[NSString alloc] init] autorelease]的便捷方法,在语义上与@""相同。

这意味着没有任何记忆益处。

答案 3 :(得分:1)

@“”用于清空NSString。 string用于清空NSMutableString。

NSString * string = @"String";
NSMutableString * mutablestring;
[mutablestring setString:@"Mutable String"];

NSLog (@"%@", string);        // String
NSLog (@"%@", mutablestring); // Mutable String

string = @"";
mutablestring = [NSMutableString string];

NSLog (@"%@", string);        // empty, nothing actually prints in NSLog
NSLog (@"%@", mutablestring); // empty, nothing actually prints in NSLog

//The below statement gives warning.
mutablestring = @"";

答案 4 :(得分:0)

@“”是一个常量字符串,因此忽略了-retain,-release和-autorelease消息。它也不能被解除分配 [NSString string]已经自动释放。

答案 5 :(得分:0)

这里只有一件事对我来说很重要:我正在使用的是一个真正的空字符串。 每次我看到[NSString string],我100%保证获得.length 0的字符串。

然而,当我看到@""时,我并非100%确定它是空的。现在,99.9999%,这是一个安全的赌注,但它可以很容易@"​"zero-width space),backspacezero-width non-joiner等。希望,虐待狂的编码员谁使用它在它附近发表评论说它是一个零宽度空间,但只是因此我的代码不那么令人困惑,我使用[NSString string]