我正在努力分析@""
和[NSString string]
的优缺点,因为它们似乎表现相似。 我想[NSString string]
返回静态值,从而避免在内存中创建不必要的字符串。 有人能解释一下吗?因为文档并不确定。
我正在努力分析@""
和[NSString string]
的优缺点,因为它们似乎表现相似。 我想[NSString string]
返回静态值,从而避免在内存中创建不必要的字符串。 有人能解释一下吗?因为文档并不确定。
很有可能@"" == [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
但我想不出任何使用情况,区别会有所影响。
[NSString string]
返回Foundation的字面量或静态值,而@""
返回由您的图像导出的字面量。如果OP需要比较指针,那么这将是相关的,但这并不是一个要求。@""
可能是最快的,但大多数人不会关心速度差异。如果OP有很多字符串比较要做,并且指针比较是一个好的选择,那么[NSString string]
的结果可能更快。 - justin@""
是一个字面量字符串,在应用程序运行期间始终存在。[NSString string]
可能是一个动态分配的对象(但可能已经优化,不是动态分配的),因此在执行时可能会被收集,当不再被引用时。无论是字面量字符串还是动态分配的字符串都在内部使用共享,所以两个 @""
或两个 [NSString string]
返回相同的对象的可能性很高,即使它们不在同一个文件中,但并没有保证它们一定会返回相同的对象。然而,它们也可能不会返回彼此相同的对象。
总的来说,这并不重要,您不应该依赖于指针相等来测试字符串相等性。
从汇编代码来看,我猜测 @""
具有更好的性能优势,但认为这很重要其实是一种过早优化的情况。
只需使用 @""
,它具有简短和清晰的优点。
[NSString string]
只是一个方便的方法,用于[[[NSString alloc] init] autorelease]
,在语义上与@""
完全相同。@"" 用于清空一个 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 = @"";
@"" 是一个常量字符串,因此对它们发送的 -retain、-release 和 -autorelease 消息将被忽略。同时它也不能被释放。
[NSString string] 已经是自动释放的了。
[NSString string]
在内存管理方面也很特殊,请查看它的引用计数。 - zoul