2012-06-11 59 views
0

我想了解一些東西。 在A班,我創建了classB的一個實例,在那裏有B,有一個計時器,總是重複,並且他永遠在錄製和播放系統。瞭解一個基本的物品

A類,我創建B與實例:

recordMachine *recMinst=[[recordMachine alloc]init]; 
[recMinst startMachine]; 
[recMinst release]; 

的事情是,在CLASSB有在接口實例變量,如播放器,錄音機指針,和其他的整數。

問題是,在我釋放A中的實例後,這個classB如何繼續工作? 沒有在內存中創建一個地方來存儲所有的B實例變量,當我釋放它 - 他們消失?

+0

您使用ARC嗎? –

+0

我不認爲我是。我怎麼能確定? – user1280535

+0

如果您使用ARC,編譯器會在[recMachine發行版]中抱怨。所以,如果它建立你不使用ARC –

回答

0

犯規A的dealloc方法釋放它在內存中創建一個地方來存儲所有B的實例變量 ,當我釋放它 - 他們消失?

是和否,釋放不像C++ delete那樣工作,例如,它不刪除對象並清除其內存,但只減少其引用計數。如果另一個對象持有它,那麼它將不會被釋放,直到另一個對象也調用釋放。

問題是,這個classB如何繼續工作,在我發佈了一個 實例之後?

關於爲什麼B繼續工作的唯一解釋是因爲一些其他對象持有它。

你提到B類使用了一個定時器(很可能是一個NSTimer),你可能已經通過了你的B實例。因此NSTimer保持對B對象的引用並防止它被破壞。

檢查你的實例的引用計數是肯定的。

NSTimer documentation說:「目標對象由定時器保留,並在定時器失效時釋放。」

+0

謝謝。我在想這是問題所在。所以那個有定時器的類中的任何東西都會保留直到驗證?所以當我釋放A時它是無用的?我不必釋放它? – user1280535

+0

該文件說時間將持有對象,直到它被無效,所以你所需要做的就是使你的析構函數方法中的時間無效。所以調用[myTime invalidate],你的B就會被銷燬。 –

+0

我這樣做。但在A中,我仍然沒有發佈分配對象? – user1280535

1

如果您需要保留B實例直到其結束,則必須將其保留在A對象中,直到A實例結束。 在你的情況下,釋放它後B的保留計數爲0,所以它被釋放。

如果你想保留它,你必須將它保留在某個地方。我建議你保留它在一個

+0

我沒有得到你,我不認爲這就是我所問。我的問題是,我是如何RELEASE B實例,它仍然繼續工作?不釋放它後,它的所有實例都不見了? – user1280535

+1

好的,對不起。如果B仍在工作,某人正在保留它或者它是在autorelease中創建的,所以它會在autorelease-pool被激活的位置釋放。 如果你想嘗試它,從模式中啓用NSZombie,並檢查你的發佈後,你的B變量是否爲殭屍。 –

+0

有點補充:你可以用A和B編碼編輯你的文章嗎? –

0

如果您沒有在-dealloc中手動發佈B的ivars,它們仍然在內存中。