2010-10-14 50 views
4

當我需要從方法中返回時,我一直非常困惑於如何處理NSMutableArray的釋放。我甚至不確定我是否想要釋放它。從方法中返回一個NSMutableArray ...我是否先釋放它? - iPhone SDK

我的代碼:

-(NSArray *)methodToCall { 

     NSMutableArray *mutArray = [[NSMutableArray alloc] initWithCapacity:10]; 

     //Fill the array with stuff here 

     [mutArray release]; //Am I suppose to have this to keep the memory down? 
     return mutArray; 
} 

我的問題是我是否我想有在代碼中[mutArray release];與否。有人能解釋這一點嗎?我很茫然,我想盡可能保持我的代碼清潔和無泄漏。

回答

9

你的方法的調用者會期望一個有效的NSArray,但它不擁有。

如果你release它是你在你的問題中的方式,你返回一個無效的對象(因爲你已經分配和釋放它)。所以這不是你想要的。

您應該在返回之前「自動釋放」數組。然後你會分配它,但在返回之前放棄所有權(不強制釋放它)。這將是有效的,直到目前的事件循環結束時自動釋放池被清理,而來電者可以保留它還是讓它去酌情:

-(NSArray *)methodToCall { 

    NSMutableArray *mutArray = [[NSMutableArray alloc] initWithCapacity:10]; 

    //Fill the array with stuff here 

    return [mutArray autorelease]; 
} 

你的其他選擇,因爲你不需要保持周圍任何引用,就是用的「自動釋放」方便的方法之一擺在首位來創建它:

-(NSArray *)methodToCall { 

    // We're not doing an explicit alloc/init here, so... 
    NSMutableArray *mutArray = [NSMutableArray arrayWithCapacity:10]; 

    // ...no autorelease necessary. 
    return mutArray; 
} 
4

簡短的回答 - 號

像現在,你分配一個數組然後在返回之前釋放(釋放)它。所以當你嘗試從你的調用方法訪問返回對象時,你將會崩潰。

我的建議是使用autorelease或調用方法或類伊娃負責這個數組對象,如果它經常使用。

autorelease的例子:

NSMutableArray *mutArray = [[[NSMutableArray alloc] initWithCapacity:10] autorelease]; 

我還建議您閱讀我們的開發者文檔的Memory Management

1

一般而言,而不是使用分配/ init以建立一個臨時數組,可以考慮使用(在這種情況下+arrayWithCapacity:)的便捷創建方法:

- (NSArray *)methodToCall 
{ 
    NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:10]; 

    // Fill the array with stuff here 

    return mutableArray; 
} 

便利創建方法如+arrayWithCapacity:返回的對象的調用者不負責,減輕管理內存負擔的調用代碼。由於調用代碼僅僅是返回引用而不是存儲它,這將簡化事情。

1

如果你通過調用alloc和init去顯式的對象分配,那麼你就是你的對象的所有者,所以你要爲它的對象保留值負責,否則你通過隱含的方式來做它,你不需要關心它。它會照顧好自己。

-(NSMutableArray *)getArray 
{ 
    NSMutableArray *array=[[NSMutableArray alloc] initWithCapacity:10]; 

    //your code 

    return [array autorelease]; 
} 
在上面的代碼

我們是對象的所有者,所以我們需要通過將自動釋放的autoreleasepool會照顧它處理它的保留計數。

-(NSMutableArray *)getArray 
{ 
    NSMutableArray *array=[NSMutableArray allocWithCapacity:10]; 

    //your code 

    return array; 
} 

在上面的代碼中,我們沒有分配任何對象,我們只是調用類方法來定義數組的大小。

如果您想要了解更多詳細信息,請點擊蘋果庫的object ownership in Memory management guide

相關問題