2012-02-07 33 views
0

快速問題:我使用了大量的NSObject派生類,並且想知道如何正確地清理可能擁有其他類的實例的類屬性(在下面的代碼片段中是一個自定義類實例的數組)。下面的newfinalize的用法是否正確?自動引用計數並完成

我的理解是,new是一種方便的方法,既調用alloc和init,又在dealloc之前調用finalize - 至少這是我從閱讀文檔中收集到的內容。我有這個權利嗎?

感謝您的任何提示/最佳做法等!

- (id)new { 
waffleArray = [[NSMutableArray alloc] initWithCapacity:kCellCount]; 

    for (int i = 0; i < kCellCount; i++) { 
     WaffleCell * cell = [WaffleCell new]; 
     [waffleArray addObject:cell]; 
    } 

    return self; 
} 

// clean up 
- (void)finalize { 

    [waffleArray removeAllObjects]; 
    waffleArray = nil; 

    [super finalize]; 
} 

回答

1

newNSObject是一個類的方法,而不是你擁有了它一個實例方法。我也不明白你爲什麼會超載new。這將是更常見的超載init所以是這樣的:

- (id)init { 
    if ((self = [super init])) { 
     waffleArray = [[NSMutableArray alloc] initWithCapacity:kCellCount]; 

     for (int i = 0; i < kCellCount; i++) { 
      WaffleCell * cell = [WaffleCell new]; 
      [waffleArray addObject:cell]; 
     } 
    } 
    return self; 
} 

至於finalize,你真的不需要這麼做。這就是Apple對此所說的:

垃圾收集器在處理它使用的內存之前在接收器上調用此方法。當啓用垃圾收集時,將調用此方法而不是dealloc。

隨着ARC的啓用,你不需要做任何事情,因爲垃圾回收器將不會運行,finalize也不會被調用。 ARC會自動生成代碼,這將會爲您的 waffleArraydealloc,這對於正確的內存管理在這種情況下是足夠的,因爲waffleArray的保留計數將降低到0,釋放本身並釋放數組中的對象。

+0

好的 - 謝謝。我不認爲我理解類和實例方法之間的區別 - 將不得不閱讀。 – 2012-02-07 13:40:16

+0

可以將類方法看作與其他語言(如Java和C++)中的靜態方法類似。在這種情況下沒有「自我」,在方法簽名的開始處用'+'表示,而不是用「-'。 – mattjgalloway 2012-02-07 13:44:07

+1

另外,要明確:ARC不是垃圾收集,在任何情況下都不會調用-finalize。 – 2012-02-07 17:54:33