2014-03-04 40 views
0

的理想方式是不是真的需要創建一個使用下面提及的格式字符串時ARC啓用創建的NSString

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

或者是理想的使用下文提到的格式使用

  1. NSString *theString = @"hello";

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

+0

做初始化之前的任務是,呃,「愚蠢的」。同樣,使用'[NSString stringWithString:@「hello」]'是「愚蠢的」,除非在非常有限的情況下。 –

回答

2

永遠不需要分配init一個NSString(或者至少它基本上是無用的),特別是如果您要立即將該變量賦值給另一個字符串。這隻會導致第一個字符串被破壞。

選項1)很好。

選項2)是壞的,你已經有了一個字符串,所以你並不需要分配單元另一個字符串實例。

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

這是完全愚蠢的,對於一個字符串或其他任何東西。您正在第一行創建一個字符串並將其扔到第二行。如果你不使用ARC,這將是一個泄漏。

+1

你是對的,當然,但我認爲少一點的態度會很酷:) –

+0

-1粗魯是沒有用的。 – Caleb

+3

既不粗魯也不態度,但在教學策略上。這是一件愚蠢的事情,我強烈地告訴Nextr不要這樣做,我顯然正確地強調這一點 - 因爲我看到StackOverflow上的人經常犯這個錯誤。它實際上是十大iOS編程錯誤之一。 – matt

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

有兩個問題與上面的代碼:

  1. 你正在創建一個新的空字符串,並將其分配給string,然後分配不同字符串對象string。第二行不會更改您在第一行創建的字符串的內容;它改變了什麼string指向。因此,第一行的唯一有用效果是它聲明瞭string變量。

  2. NSString是代表不可變的字符串類。也就是說,一旦你創建NSString的實例,你就不能改變它。創建它時,必須提供不可變對象的內容。所以,當你說[[NSString alloc] init],你會得到一個空字符串,就永遠不能成爲非空,和你正在試圖做的,這不是你想要的東西判斷。

因此,您需要決定是否要包含「Hello」的不可變字符串或稍後可以更改的可變字符串。在前一種情況下,你可以做這樣的:

NSString *string = @"Hello"; 

或類似:

NSString *string = [NSString stringWithString:@"Hello"]; 

或類似:

NSString *string = [[NSString alloc] initWithString:@"Hello"]; 

所有這些都是有效的,但第一個是最短的並且最清楚。如果你想有一個可變的字符串,你可以說:

NSMutableString *string = [NSMutableString string]; 
[string setString:@"Hello"]; 

一個較短的方式做同樣的事情是:

NSMutableString *string = [@"Hello" mutableCopy];