2008-12-12 85 views
3

我已經看到了使用不同方式釋放/釋放對象的示例源代碼,所以我想知道哪種方式被認爲是「最好」的。在-dealloc有幾個選項:清理iPhone應用程序內存的最佳做法?

1)發行對象

- (void)dealloc { 
    [obj1 release]; 
    [obj2 release]; 
    [super dealloc]; 
} 

2)設置對象零

- (void)dealloc { 
    self.obj1 = nil; 
    self.obj2 = nil; 
    [super dealloc]; 
} 

3)取消分配對象直接

- (void)dealloc { 
    [obj1 dealloc]; 
    [obj2 dealloc]; 
    [super dealloc]; 
} 

哪種方式是最好的嗎?每個優點和缺點?

回答

8

方法1是唯一推薦的方法。在您釋放它們之後將它們設置爲零也是很好的做法。

方法2只適用於管理自己的對象/值保留的屬性,所以它不是普遍適用的。如果你實現了你自己的setter方法,當屬性改變時執行其他操作,你可能會在[dealloc]中調用它來獲得不希望的副作用。

方法3違反引用計數原理,因爲它會回收對象即使別的東西有一個[保留]抓住了他們,所以當其他物體下一訪問它們,你的程序會崩潰。你永遠不應該直接調用[dealloc] - 讓運行時在最後一個所有者調用[release]時調用它。

+0

同意。方法1是最好的。方法3幾乎可以確保您的應用程序崩潰。和Marco一樣,方法2可能會導致意想不到的副作用。 dealloc方法的目的是釋放你持有的任何對象。調用這些對象的發佈是唯一有意義的事情。 – Alex 2008-12-12 20:35:16

+0

我每次使用方法2時都會遇到屬性繁瑣的問題,並且會針對現代運行時(我甚至不直接聲明任何ivars)。當然,這只是因爲gcc不允許你直接訪問自動生成的ivars(雖然即將到來)。 – 2008-12-13 23:31:19

1

如果obj1和obj2是使用@ synthesize-d訪問器的屬性,則方法1和方法2是等效的。如果這兩種情況中的任何一種不是真的,那麼效果就會有所不同。如果它們不是屬性,那麼方法2只是將指針設置爲零而不做任何可以釋放對象的操作。如果它們是屬性,但是您已經實現了自己的setter方法,則方法2將以「nil」作爲參數來調用這些方法。這與方法1是否相同取決於你如何實現這些方法。如果您的自定義設置器在參數爲零時做了任何重要的事情,方法2將確保執行此代碼。

正如Marco所說,方法3顯然是錯誤的。如果你看過示例代碼,那麼作者可能並不知道他們在做什麼。

相關問題