对 NSString 方法的说明

Clarification on NSString methods

我想在 NSString 声明中得到一个 clarification/difference。考虑以下代码:

NSString *str = @"string";
NSString *str = [NSString stringWithFormat:@"string"];
NSString *str = [[NSString alloc] initWithString:@"string"];

谁能帮我理解以上三种字符串声明的区别?差异是在内存方面还是有其他原因?我浏览了各种帖子以了解其中的区别,但我无法理解确切的区别。

斯雷

编辑(感谢评论):

使用 ARC,编译器使用第一条语句创建一个字符串,该字符串在应用程序的生命周期内可以访问并且永远不会被释放。 最后两个语句产生相同类型的字符串。

使用手动内存管理,第二条语句生成一个自动释放的字符串。 最后一个产生一个保留的字符串。这意味着,当使用最后一条语句时,您必须稍后在代码中添加一个版本。

我记得在这个案例中 NSString *str = @"string"; 字符串的内存将分配一次,并将在整个应用程序中重复用于所有相同的字符串。像全局常量之类的东西。 https://en.wikipedia.org/wiki/String_literal

有证据:"Objective-C string constant is created at compile time and exists throughout your program’s execution. The compiler makes such object constants unique on a per-module basis, and they’re never deallocated" https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Strings/Articles/CreatingStrings.html

其他2个一样,也可以用stringWithFormat方法合成字符串:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles/FormatStrings.html#//apple_ref/doc/uid/20000943

for: NSString *str = @"string"; 用作静态字符串时使用。

   for Exmple.
   int abc=5;

for: NSString *str = [NSString stringWithFormat:@"%d",abc]; 在将整数或浮点数转换为字符串时使用。

for: NSString *str = [[NSString alloc] initWithString:@"string"]; 在上述相同原因时使用,但唯一不同的是你分配字符串然后传递静态字符串。

但在 ARC 中不需要分配字符串。

NSString 文字

@"string"

这将使编译器发出静态分配的 NSString 实例。对象本身永远不会被释放(release 是一个空操作)。

格式中的唯一实例

[NSString stringWithFormat:@"string"]

这里的字符串是通过解析和转换格式字符串创建的。这涉及运行时开销和 returns 一个自动释放的实例。

通过复制文字进行初始化

[[NSString alloc] initWithString:@"string"]

这将 (1) 创建文字,(2) 分配默认字符串,(3) 丢弃默认字符串,(4) 在文字上调用复制,以及 (5) return结果(再次,文字,因为只复制 returns 它)。逻辑保留计数为 +1(由 ARC 自动处理)。