2011-06-01 56 views
1

我製作了一個使用相機解碼條形碼的物體。如果成功,則將委派消息發送到下一個操作,如果不成功,則它僅出現,並且下一個屏幕開始工作。還是[self dealloc]工作?

如果我在對象的最後一個命令中,我可以發送[自釋放]來釋放內存嗎?但問題是:retainCount可能不止一個?

ObjectToDealloc *test = [[ObjectToDealloc alloc] init]; 
    [test doYourJob]; 
    //can't release here, it broke my program 
中的最後一件事,這個對象呢,它運行

-(void)destroyYourself { 
    [self release]; 
    [self dealloc]; 
    } 

這是否行得通呢?我會釋放內存?或者,我不得不在全球知名度(不僅功能可見性)「測試」,並做了:

[test release]; 

回答

5

有,我已經看到,保留自己爲了類,來保持自己的周圍,直到一對夫婦的情況下,他們執行工作。永遠不會,永遠不會,永遠打電話DEALLOC *。 012allDealloc不適合你,而是運行時。如果你不再需要一個對象,只需適當地釋放它。調用該方法只是運行時的責任。

下面是我經常使用的一些代碼示例,其中對象保留自身,然後在完成其工作時適當地釋放自身:UIAlertView+Blocks此代碼執行此操作是因爲該對象即使在釋放後仍然存在通過實例化類,以便它可以運行並完成它要執行的塊。

* 除了在你自己的dealloc中調用你的super的dealloc,但這是不言而喻的。

+4

除了'[super dealloc];'... – albertamg 2011-06-01 19:42:49

+1

我覺得有一個與Clang團隊一起提出的使用'[self dealloc]'的錯誤 - 我們在調試pub中的朋友代碼時發現了這個錯誤。這將節省很多頭痛。 – Abizern 2011-06-02 13:26:49

6

這是不正確的內存管理。當[self release]正確時,有少數情況。沒有任何情況下[self dealloc]是正確的(除非你的超類在你自己的dealloc中,否則你不應該打電話給任何人的dealloc)。

當你說「它打破了我的計劃」,你是什麼意思? ObjectToDealloc是否執行某種後臺處理?如果沒有,那麼你應該始終能夠在你指明的位置釋放它。如果它確實做了後臺處理,那麼你需要一些東西來保留對象直到完成,然後釋放它。每隔一段時間,最好的方法就是保留並釋放self,但通常你會做一些其他事情,比如NSOperationQueue或類似的東西。

這裏更可能的問題是,您在ObjectToDealloc中正在處理內存管理不正確,並且在它解除分配時崩潰。什麼是崩潰?

要記住的關鍵是,你永遠不會說在ObjC中「立即銷燬這個對象」。你說「我完成了這個對象。」當每個人都完成對象時,它就會被運行時破壞。

相關問題