2012-07-06 168 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。由於字符串是不可變的這樣共享是安全的,但一般而言,您應該依賴於它,並嘗試使用比較基準比較(==)字符串。