2011-09-26 45 views
2

我知道Objective-C中內存管理的基本規則是,對於你做alloc的每個對象,你都需要將它釋放到某個地方。何時釋放在整個班級中使用的對象?

說我有以下幾點:

@interface NewPollViewController : UIViewController 
{ 
    NSMutableArray * myArray; 
} 

@property (nonatomic, retain) NSMutableArray * myArray; 

@implementation NewPollViewController 
@synthesize myArray = _myArray; 

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.myArray = [[NSMutableArray alloc] init]; 
} 

這不能不說self.myArray作爲一個UITableView的數據源,所以當我應該在哪裏釋放呢?在dealloc中?我想在dealloc中的版本對應於我在屬性中設置的保留,所以我在哪裏發佈

回答

3

在您的示例中,您在技術上需要釋放它兩次 - 一次在dealloc之後,屬性:

NSMutableArray *a = [[NSMutableArray alloc] init]; 
self.myArray = a; 
[a release]; 

這樣做的原因是因爲你特別是在viewDidLoad分配內存,然後也增加了保留計數設置屬性時。

避免這個的一種方式是使用靜態NSMutableArray構造函數之一或使用autorelease

self.myArray = [[[NSMutableArray alloc] init] autorelease]; 

可替代地,可以完全繞過屬性:

myArray = [[NSMutableArray alloc] init]; 

這將避免產生額外的保留由財產(事實上,你可以擺脫財產聲明,如果它只是在本地使用)。

+0

你也想在'dealloc'中發佈它。 – Chuck

+1

'self.myArray = [NSMutableArray數組]'可能比'alloc','init','autorelease'三重奏更簡潔。 –

+0

我同意 - 我更喜歡這種形式 –

0

在你的情況下,我經常會在viewDidUnload以及dealloc中發佈它。

我喜歡維護一個關於內存分配的鏡像。當它在viewWillAppear完成時,我發佈在viewWillDisappear

現在既然你說這是用到了班級,我會分配一個init方法,或者awakeFromNib,然後在dealloc中發佈一次。

+0

對於第三種選擇,您仍然必須將其釋放兩次......爲什麼當您在init中使用Lloc時,您只需要釋放它一次? – xonegirlz

+0

因爲它與視圖或其裝載或可見不相關。當它最終轉到'dealloc'時是你想要釋放它的時候。如果這是'myArrayOfSubviews',那麼你可能會做加載/卸載的創建和釋放,以正確響應內存警告。 – EricLeaf

1

如果我要揭露一個NSMutableArray的我會做到這一點:

@interface NewPollViewController : UIViewController 
{ 
    NSMutableArray * myArray; 
} 

@property (nonatomic, readonly) NSMutableArray * myArray; 

@implementation NewPollViewController 
@synthesize myArray; 

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.myArray = [[NSMutableArray alloc] init]; 
} 

- (void) dealloc 
{ 
    [myArray release],myArray = nil; 
} 

改爲只讀屬性,因爲它的可變數組,你不希望其他類更改此數組,你是正確alloc和釋放它。

+0

NSMutableArray只是一個例子,它可以是任何對象 – xonegirlz

+0

如果它的String Literal和一個iVar分配給它,那麼你不會分配和釋放它。如果它的String對象使用copy,並且不需要在viewDidLoad中alloc和init。通常情況下,您不會以保留形式撥打有關財產的撥款 – ARC

+1

@Nikita - 你的代碼在技術上會泄漏。要在一行中設置屬性,您應該使用NSMutableArray靜態構造函數或autorelease之一。除非你從初始化陣列的地方移除「自我」。請參閱http://stackoverflow.com/questions/156243/object-allocate-and-init-in-objective-c/167783#167783 –