初始化ObjectC中的空string?

有人使用以下来初始化NSstring

NSString *astring = [[NSString alloc] init]; 

我想知道为什么不使用

 NSString *atring = nil or NSString *astring = @"" 

NSString *astring = [[NSString alloc] init];之间没有语义上的区别NSString *astring = [[NSString alloc] init];NSString *astring = @""; – 但是NSString *astring = nil; 是完全不同的。 前两个产生对不可变string值的引用,最后一个表示没有值。

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

 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 

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

 0x7fff7100c190, 0x7fff7100c190, 0x1000028d0, 0x1000028d0, 0x1000028d0 

显示只创build了2个零长度的string对象 – 一个用于@"" ,一个用于alloc / init 。 由于string是不可变的,所以这种共享是安全的,但是一般来说,你不应该依赖它,并试图使用引用比较来比较string( == )。

 NSString *atring = nil 

是不同的 – 这是一个零指针,不是一个空string。

 NSString *astring = @"" 

几乎是一样的,如果你把它改成类似的东西

 NSString* astring=[@"" retain]; 

这是“无所谓”的事情之一。 他或她只是使用一种方式。 可能没有特别的理由。

NSString * atring = nil; 只是简单地将指针设置为零,除了确保指针设置为零以外,什么都不做。

NSString * astring = @“”; 是一个简写字面,相当于[NSString stringWithString:@“”];

在另一点上,我不知道为什么你会想要初始化一个string,如果它不可变,因为你将不能改变它以后不覆盖它。