在ObjectC中初始化空字符串?

use*_*949 3 objective-c ios

有人使用以下内容初始化NSstring

NSString *astring = [[NSString alloc] init];
Run Code Online (Sandbox Code Playgroud)

我想知道为什么不使用

NSString *atring = nil or NSString *astring = @""
Run Code Online (Sandbox Code Playgroud)

CRD*_*CRD 10

和之间没有语义差异- 但完全不同.前两个产生对不可变字符串值的引用,最后一个表示缺少值.NSString *astring = [[NSString alloc] init];NSString *astring = @"";NSString *astring = nil;

生成零长度字符串的各种方式是否产生不同的对象完全是一个实现细节.代码:

NSString *a = [[NSString alloc] init];
NSString *b = [NSString new];
NSString *c = @"";
NSString *d = [NSString stringWithString:@""];
NSLog(@"%p, %p, %p, %p, %p", a, b, c, d, @""); // %p = print the value of the reference itself
Run Code Online (Sandbox Code Playgroud)

输出(确切的值会有所不同):

0x7fff7100c190, 0x7fff7100c190, 0x1000028d0, 0x1000028d0, 0x1000028d0
Run Code Online (Sandbox Code Playgroud)

显示只显示2个零长度字符串对象 - 一个用于@"",一个用于alloc/ init.由于字符串是不可变的这种共享是安全的,但一般而言,您应依赖于它,并尝试使用比较基准比较字符串(==).