对 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 自动处理)。
我想在 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 自动处理)。