初始化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,如果它不可变,因为你将不能改变它以后不覆盖它。