@""与[NSString string]的区别

5

我正在努力分析@""[NSString string]的优缺点,因为它们似乎表现相似。 我想[NSString string]返回静态值,从而避免在内存中创建不必要的字符串。 有人能解释一下吗?因为文档并不确定。


仅是补充下面的答案。一旦编译了字面值@"Foo"。任何其他@"Foo"字面量都将是指向第一个的指针。 - RobCroll
6个回答

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 但是你的第二行证明了OP的希望。第四行在这里不相关。[NSString string]返回Foundation的字面量或静态值,而@""返回由您的图像导出的字面量。如果OP需要比较指针,那么这将是相关的,但这并不是一个要求。@""可能是最快的,但大多数人不会关心速度差异。如果OP有很多字符串比较要做,并且指针比较是一个好的选择,那么[NSString string]的结果可能更快。 - justin
如果第四行是真的,我认为讨论大部分都是无意义的,这就是为什么我把它包括在内的原因。感谢澄清! - zoul

2

@"" 是一个字面量字符串,在应用程序运行期间始终存在。[NSString string] 可能是一个动态分配的对象(但可能已经优化,不是动态分配的),因此在执行时可能会被收集,当不再被引用时。无论是字面量字符串还是动态分配的字符串都在内部使用共享,所以两个 @"" 或两个 [NSString string] 返回相同的对象的可能性很高,即使它们不在同一个文件中,但并没有保证它们一定会返回相同的对象。然而,它们也可能不会返回彼此相同的对象。

总的来说,这并不重要,您不应该依赖于指针相等来测试字符串相等性。

从汇编代码来看,我猜测 @"" 具有更好的性能优势,但认为这很重要其实是一种过早优化的情况。

只需使用 @"",它具有简短和清晰的优点。


我认为Rob不想使用指针比较字符串,那只是我的测试,以发现不同字符串构造函数背后隐藏的优化。 - zoul

1
我相当确定[NSString string]只是一个方便的方法,用于[[[NSString alloc] init] autorelease],在语义上与@""完全相同。
这意味着根本没有任何内存优势。

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 = @"";

0

@"" 是一个常量字符串,因此对它们发送的 -retain、-release 和 -autorelease 消息将被忽略。同时它也不能被释放。
[NSString string] 已经是自动释放的了。


2
在当前由Apple实现的情况下,[NSString string] 在内存管理方面也很特殊,请查看它的引用计数。 - zoul

0

对我来说,这里只有一件事情是最重要的:我使用的是一个真正的空字符串。每次看到[NSString string],我都可以100%保证得到一个长度为0的字符串。

然而,当我看到@""时,我不能百分之百确定它是空的。现在,99.9999%,这是一个安全的赌注,但它也可能是@"​"(零宽度空格),退格键零宽度非连接符等。希望那个使用它的变态程序员在附近加上一个注释,说明它是一个零宽度空格,但为了让我的代码不那么混乱,我使用[NSString string]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接