2012-07-06 129 views

回答

2
NSString *atring = nil 

是不同的 - 这是一个零指针,而不是一个空字符串。

NSString *astring = @"" 

几乎是一样的,如果你把它更改为类似

NSString* astring=[@"" retain]; 

它的东西,“无所谓的”一个;他或她只是使用一种方式。可能没有特别原因。

+3

你不需要像'@“”'那样保留常量字符串。 – duskwuff 2012-07-06 23:01:54

+0

嗯...也许这只是一个老习惯,我必须承认我从来没有检查过。我只是不喜欢发布我没有保留的东西,总是让我感觉不平衡。 – 2012-07-06 23:10:34

+0

我不认为你必须要么释放它,如果这让你感觉更好;) – 2012-07-07 00:25:14

2

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

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

上的另一点,我不知道你为什么会想初始化字符串来什么,如果它不是可变的,因为你将无法再改变它没有覆盖它。

+4

我不相信的NSString * ASTRING = @“”等同于[的NSString stringWithString:@“”];我认为文字字符串生活在程序的静态内存部分。 stringWithString:表示内存分配在堆IIRC上。 – 2012-07-06 23:51:39

+0

@BrianPalma正确。你可以在CFString的实现中看到这一点,它与Objc-3.0中的新数字文字相同 – 2012-07-07 01:35:52

+1

实际上'''* *'相当于'[NSString stringWithString:@“”]',因为基金会框架中的优化。它看到你正在试图用一个不可变的字符串创建一个不可变的字符串,所以它会短路并给你原来的字符串。 – 2012-07-07 02:12:17

8

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。由于字符串是不可变的这样共享是安全的,但一般而言,您应该依赖于它,并尝试使用比较基准比较(==)字符串。