2011-03-03 71 views
3

考慮下面的代碼正確的方式把NSString的內部NSMutableArray的方法

- (void) method1 
{ 

list = [[NSMutableArray alloc] init]; 

NSString *f =[[NSString alloc] initWithCString: "f"]; 

[list addObject: f]; 
} 

- (void) method2... 

列表是一個類的實例變量中,我需要訪問所有的變量列表內的其他方法,例如方法2,當我分配一個NSString在方法1,我應該需要保留它嗎?我發現不需要保留?爲什麼?

+1

'-initWithCString:'已棄用,因爲結果可能因用戶的默認字符編碼而異。要麼只是使用直接文字'NSString * f = @「f」;'或使用'-initWithCString:encoding:'或使用'-initWithUTF8String:' – JeremyP 2011-03-03 16:31:55

回答

4

當你alloc的東西,你已經是業主,所以沒有必要retain它。

查看here的全文。

你的方法(和類)實際上在內存管理方面寫得很差。你應該:

  1. 釋放list分配和它分配一個新的列表之前

  2. dealloc方法釋放list

  3. 釋放字符串中,你將它添加到陣列

因此,將您的方法更改爲:

- (void) method1 { 
    [list release]; 
    list = [[NSMutableArray alloc] init]; 
    NSString *f = [[NSString alloc] initWithCString: "f"]; 
    [list addObject: f]; 
    [f release]; 
} 

- (void) dealloc { 
    [list release]; 
    // release other instance variables... 
    [super dealloc]; 
} 
+0

爲什麼我需要在method1的末尾釋放f? – Howard 2011-03-03 17:24:11

+0

因爲你需要平衡保留隱含的分配... – bbum 2011-03-03 17:50:44

+0

確切的說,因爲你_own_f(你'分配它),它是''釋放'它的責任。 – 2011-03-03 18:05:32

0

您將需要一個@該字符串@「F」

,這涵蓋了內存管理問題 NSMutableArray memory management

+0

你不需要'@',因爲他使用C字符串初始化,而不是NSString。 – yan 2011-03-03 16:02:17

+0

他使用'initWithCString:',所以@是不合適的。請記住,儘管這是一個*棄用的方法*,所以@Howard,不要使用它! – Richard 2011-03-03 16:02:35

+0

對不起。你們是對的。沒有@需要。 – madmik3 2011-03-03 16:04:56

0

你不需要把它保留下來,因爲你是主人當你alloc一個類並接收一個實例。添加到NSMutableArray後,您實際上需要釋放它。當向NSMutableArray添加對象時,它會向它們發送retain消息並取得所有權。

此外,請注意initWithCString已被棄用。如果你需要從C柱到初始化使用下列方式代替:

[NSString stringWithCString:"f" encoding:NSUTF8StringEncoding]; 

但如果你只是建立一個恆定的NSString,只使用文字。它會自動自動釋放,讓您的意圖更清晰。即:

list = [[NSMutableArray alloc] init] 
[list addObject:@"f"]; 
+0

>>向NSMutableArray添加對象時,會向其發送保留消息並獲取所有權。 - 關於這個的任何文件? – Howard 2011-03-03 17:24:42

+0

@霍華德:你其實不需要這些信息。重要的是要知道,因爲你_own_f,你必須釋放它。您不需要知道_other_代碼如何正確寫入_your_代碼。 – 2011-03-03 18:07:02