有人使用以下方法初始化NSstring
NSString *astring = [[NSString alloc] init];
我想知道为什么不使用
NSString *atring = nil or NSString *astring = @""
答案 0 :(得分: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
输出(确切的值会有所不同):
0x7fff7100c190, 0x7fff7100c190, 0x1000028d0, 0x1000028d0, 0x1000028d0
仅显示2个零长度字符串对象 - 一个用于@""
,另一个用于alloc
/ init
。由于字符串不可变这样的共享是安全的,但通常你应该不依赖它并尝试使用引用比较(==
)来比较字符串。 / p>
答案 1 :(得分:2)
NSString *atring = nil
是不同的 - 它是一个nil指针,而不是一个空字符串。
NSString *astring = @""
几乎相同,如果你将其改为
NSString* astring=[@"" retain];
这是“无关紧要”的事情之一;他或她只是单向使用。可能完全没有特别的原因。
答案 2 :(得分:2)
NSString * atring = nil;只是将指针设置为nil,除了确保指针设置为nil之外什么都不做;
NSString * astring = @“”;是一个简写文字,相当于[NSString stringWithString:@“”];
另一方面,我不知道为什么你想要将字符串初始化为空,如果它不可变,因为你将无法在不改写它的情况下更改它。