我正试图找出@""
和[NSString string]
的优点和缺点,因为它们似乎以类似的方式表现。我想我希望[NSString string]
返回一个静态值,从而避免在内存中创建不必要的字符串。任何人都可以解释一下,因为文件是不确定的。
答案 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),backspace,zero-width non-joiner等。希望,虐待狂的编码员谁使用它在它附近发表评论说它是一个零宽度空间,但只是因此我的代码不那么令人困惑,我使用[NSString string]
。