2014-02-24 93 views
3

我是新來的IOS development.I被檢查的NSString和我在那裏發現它使用多種方式這是因爲在多的NSString聲明和初始化

1)NSString *theString = @"hello";

被excessed 2)NSString *string1 = [NSString stringWithString:@"This is"];

3)NSString *string =[[NSString alloc]init]; string [email protected]"Hello";

現在我很困惑與上述三個並想知道再有什麼區別?

+0

@trojanfoe你能詳細點嗎? – Peres

+0

'string'被創建(空),然後用一個常量字符串重新初始化。這是1)的低效版本。 – trojanfoe

+3

這是一個非常不同的解釋,而不是「被打破」。特別是當你在iOS開發中與新人交談時。 – Peres

回答

2

是三者的方法來創建字符串...我試圖解釋,你一個接一個。

一個人認爲你必須記住,在Objective-c字符串表示爲@""。 無論什麼來雙引號是字符串,例如@"Hello"string@""基本上是創建NSString

  1. NSString *theString = @"hello";

編輯:

在這次發言中,我們正在創建一個NSString不變。 Objective-C字符串常量在編譯時創建,並存在於整個程序的執行過程中。

2. NSString *string1 = [NSString stringWithString:@"This is"]; 

在此再次聲明,我們正在創建的NSStringautorelease對象,但在這裏滑差速器。比第一種情況。這裏我們使用另一個NSString對象來創建NSString的新對象autorelease。所以當我們已經有NSString對象時,我們通常使用stringWithString方法,並且我們需要另一個具有相似內容的NSString對象。

3. NSString *string =[[NSString alloc]init]; 
      string [email protected]"Hello"; 

這裏,在第一條語句,你正在創建你所擁有的NSString對象,這是你的責任,以釋放它(在非ARC碼),一旦你這個對象來完成。 第二條語句與案例1相似,用字符串文字創建字符串Object。 但是當你把這兩個報表一併它會導致你memory-leak(在非ARC代碼),因爲在陳述一個你分配 & 啓動內存新的字符串對象,並在第二個語句右後你再將新的字符串對象分配給相同的字符串引用。

+0

從什麼時候@「」或@「一個字符串」創建任何自動釋放?這是無稽之談。 @「一個字符串」是一個指向NSString對象的指針,只要應用程序永遠不會被釋放,它就會生活。 – gnasher729

+0

@ gnasher729你是對的,'@「」'不會創建任何'autorelease'。它們被稱爲'NSString'常量,並且存在於整個程序中。感謝指出這一點,我編輯了我的答案。 – Suryakant

0

好的,首先,語法@"blah"是一個用於創建NSString的Objective-C文字。本質上它是一個NSString。

另外,每個語句都有兩個部分。字符串變量NSString *string的聲明和實例string = <something>

所以......

  1. 這是你會怎麼做它的大部分時間。您聲明變量並使用objective-c文字來設置它。

  2. 這增加了一些冗餘,你不會像這樣真的使用它。你可能會使用它的子字符串或另一個字符串的東西。因爲它實質上是在這裏創建兩個對象。第一個是[NSString stringWithString:<>];,第二個是@"This is"

  3. 這有點奇怪。您首先創建一個空字符串@"",然後用@"Hello"替換此字符串。不要這樣做。無關緊要。你可能只是做1號,因爲結果是一樣的。

所有這三個都會工作,但在這些確切的情況下,你會更好地使用第一個。

+1

我認爲OP的印象是:3)可以做,但他應該不鼓勵使用它。你沒有這樣做。 – trojanfoe

+0

@trojanfoe增加了一點到我的答案。 – Fogmeister

1

1)和2)是相同的。沒有區別。 [NSString stringWithString:str]不做任何事情,並且如果str已經是不可變的,則返回str。通過this link

3)你創建空的NSString指針。在給這個字符串賦值'='之後,就和1)一樣,並且它將內存分配給你的NSString。您可以在3看這個的NSString指針),你看到指針改爲:

NSString *string =[[NSString alloc]init]; 
printf("\n string_1-> = %p\n", string); 
string = @"Hello"; 
printf("\n string_2-> = %p\n", string);