2010-10-21 157 views
0

我有點迷路了內存管理。我讀過,你應該釋放,只要你分配。但是當你得到一個沒有alloc的實例時,你不應該發佈。iPhone內存管理

這情況怎麼樣,只需要知道如果我編碼正確。我還是iphone開發新手。

我有一個類CustomerRepository它有一個方法

- (MSMutableArray *) GetAllCustomers() { 

    MSMutableArray *customers = [[MSMutableArray alloc] init]; 

    Customer *cust1 = [[Customer alloc] init]; 
    cust1.name = @"John"; 

    Customer *cust2 = [[Customer alloc] init]; 
    cust2.name = @"Tony"; 

    [customers addOjbect:cust1]; 
    [customers addOjbect:cust2]; 

    [cust1 release]; 
    [cust2 release]; 

    return customers; 

} 

然後,我有一個UIViewController

- (void) LoadCustomers() { 

     CustomerRepository *repo = [[CustomerRepository alloc] init]; 

     MSMutableArray *customers = [repo GetAllCustomers];   

     // Iterate through all customers and do something 

     [repo release]; 

} 

因此,在這種情況下...的MSMutableArray永遠不會釋放?它應該放在哪裏?

回答

6

如果你在函數中分配一個對象,你需要從該函數返回,那麼你不能在函數內部釋放它。正確的方法是自動釋放對象。

 
MSMutableArray *customers = [[MSMutableArray alloc] init]; 

// ..... do work 

return [customers autorelease]; 

這是由connivence構造像

 
[NSString stringWithString:@"test"]; 

採取這種方法將返回一個autoreleased字符串,這樣你就不需要將其釋放的方法。

如果你不這樣做,那麼你應該相應地命名你的函數,調用者知道它擁有返回的對象,因此需要釋放。這些都是約定,不是編譯器或運行時環境強加的規則,但遵循約定是非常重要的,特別是當多個人參與到項目中時。

+0

我讀過的地方autorelease是不是太好,無法在iPhone上使用。但在我的情況下,我真的別無選擇,只能autorelease(這是垃圾收集正確)?在我的GetAllCustomers方法中返回autorelease更好嗎?或者只是讓repo創建數組,但LoadCustomer方法在完成時釋放它? – pdiddy 2010-10-21 17:34:03

+0

你讀過關於autorelease的內容絕對不對。閱讀Apple的內存管理指南。它可能需要一兩天才能閱讀,但會爲您節省很多災難。在這種情況下,你應該在GetAllCustomers方法中自動釋放,因爲方法名並不意味着調用者將擁有返回的對象。 – taskinoor 2010-10-22 04:33:53

0

客戶數組在迭代完成後應該被釋放。您將數組的創建委託給您的repo對象,但您的LoadCustomers方法擁有該數組。

另一種方法是讓您的CustomerRepository公開allCustomers屬性。您可以懶惰地初始化您的getter中的數組,然後在CustomerRepository發佈時釋放數組。這將保持你的調用分配和釋放在同一個對象。

0

它應該在您的視圖控制器LoadCustomers()中發佈,因爲您正在使用您調用的方法分配它,它仍然是由YOU擁有

2

每當您從方法或函數創建並返回一個對象時,該對象應該是autorelease d。例外情況是當方法以CreateNew(或顯然是Alloc)開始時,或者當方法中緩存對象時。

這表明釋放它在LoadCustomers其他的答案是不正確的,因爲GetAllCustomers並不意味着像CreateCustomersArrayNewCustomersArray將所有權轉讓。但是,您不能釋放GetAllCustomers中的對象,因爲在返回對象之前將會釋放該對象。解決方案是autorelease

+0

該方法的命名上的好處並不意味着該對象的所有權轉移。 – highlycaffeinated 2010-10-21 15:33:54

+0

所以我唯一的選擇是使用autorelease正確 – pdiddy 2010-10-21 17:46:19

+0

當方法以Create開始時,它是如何轉移所有權的? – pdiddy 2010-10-21 17:47:22