2013-07-10 51 views
0

也許我工作時間太長,但有這個問題... 讓我們把它抽象化,真名不重要。釋放對象不起作用

我已經20多類從其超繼承,租車

@interface Car : NSObject; 
@interface Volvo : Car; 
@interface BMW : Car; etc... 

在我的遊戲類我已經爲沃爾沃財產,寶馬

@property (nonatomic, strong) Volvo *volvo; 
@property (nonatomic, strong) BMW *bmw; 
@property (nonatomic, strong) Car *activeCar; 

我創建這些對象dynamicaly和存儲activeCar在財產積極汽車

_bmw = [[BMW alloc] init];  
_activeCar = _bmw; 

現在在重新啓動方法我想能夠無主動車,b即使在日誌中我看到兩者都指向同一地址:

_activeCar = nil; // dealloc on BMW and Car is not called 
// _bmw = nil; // dealloc is called properly on BMW and Car class 

如何管理該問題?這是唯一的解決方案嗎?

if ([_activeGame isKindOfClass:[BMW class]]) 
_bmw = nil; 
+0

我建議你的應用程序模擬有點奇怪,爲什麼汽車品牌不僅僅是一個Car類實例的另一個屬性? – bbum

+0

我沒有在我的真實應用中使用汽車。這只是爲了說明繼承。無論如何,bmw和volvo不僅僅是一個具有特定方法和屬性的新類,而且還有其他類。 – alexhajdu

+0

一般來說,大量使用'isKindOfClass:'是一種代碼味道;它表明應用程序的體系結構非常不穩定。我會建議重新考慮你的設計,試圖消除這種內省。 – bbum

回答

2

如果你想在摧毀活性汽車的時候摧毀寶馬,那麼無論如何,保持寶馬作爲一個伊娃都沒有意義。

_activeCar = [[BMW alloc] init]; 

您當前的執行不會無了寶馬,因爲self.bmw仍然有它的參考。

+0

哈哈,當然:D – alexhajdu

2

activeCar實際上始終保留兩次,因爲你有2種strong性質提到它。因此,您可以將activeCar設爲零,但其他屬性仍將設置。

如果您不想讓車在成爲activeCar之後,那麼在將其設置爲activeCar後,您可以直接刪除另一個參考。

+0

這是個好主意。有沒有其他解決方案,比如將activeCar設置爲弱? – alexhajdu

+0

你可以將它設置爲'弱',但是如果它不起作用(從釋放的角度來看),所以你會被迫進入其他機制(比如你的班級檢查,這不是很漂亮)。 – Wain

+0

謝謝,我發現第一個解決方案完美的工作。 – alexhajdu