4

有人使用以下来初始化 NSstring

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

我想知道为什么不直接使用

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

3 回答 3

13

和- 之间没有语义差异,但完全不同。前两个产生对不可变字符串值的引用,最后一个表示没有值。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。由于字符串是不可变的,因此这种共享是安全的,但通常您不应依赖它并尝试使用引用比较 ( ==) 来比较字符串。

于 2012-07-07T01:23:03.607 回答
2
NSString *atring = nil

是不同的——它是一个 nil 指针,而不是一个空字符串。

NSString *astring = @""

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

NSString* astring=[@"" retain];

这是“无关紧要”的事情之一;他或她只是使用了一种方式。可能根本没有特别的原因。

于 2012-07-06T23:01:32.917 回答
2

NSString *atring = nil; 只是将指针设置为 nil,除了确保指针设置为 nil 之外什么也不做;

NSString *astring = @""; 是一个速记文字,相当于 [NSString stringWithString:@""];

另一方面,我不知道为什么如果字符串不可变,您为什么要将字符串初始化为空,因为您以后将无法在不覆盖它的情况下更改它。

于 2012-07-06T23:01:44.037 回答