2010-10-21 69 views
0

我的應用程序將創建一個對象。該對象將持續運行其中一種方法,比如批處理圖片。iphone - 如果我釋放一個對象,而對象仍在運行它的一種方法時該怎麼辦?

如果它的方法正在運行,並且我釋放該對象並且它被處置,那麼iOs是否會自動處理對象的方法?例如,自動停止運行該對象的方法並避免bad_exec?

+1

您是否在後臺/ nsoperation隊列中使用多個線程/運行選擇器/其他「運行」對象? – JosephH 2010-10-21 08:19:07

+0

請回答Joseph的問題。一般來說,不,操作系統不會爲你做你的菜,如果你在一個方法內運行時,它的對象消失。在實踐中,如果你遇到這種情況,那麼在那之後,引用self或ivars就會炸燬。如果你沒有任何這樣的引用,那麼它可能不應該是一種方法。 – 2010-10-21 08:27:56

+0

約瑟夫,我在一個線程中運行[obj performSelectorOnMainThread:@selector(method)wait:YES]。並且有可能在主線程外部釋放此對象。 – Jack 2010-10-21 11:39:39

回答

1

當你調用release並且你的引用計數達到0時,你的對象的dealloc被調用。而已。

這意味着:如果你正在一個線程上處理並且你的對象被髮送從另一個線程釋放(或者出於其他一些不好的原因,同一線程),那麼你應該預期未定義的行爲(這可能導致終止, EXC_BAD_ACCESS或其他令人愉快的東西)。在這種情況下應該保持對對象的引用(例如,NSOperation子類)。

0

如果你釋放一個對象,這意味着操作系統可以自由地重用內存並用其他數據覆蓋它。因此,在對象的方法中,在最終釋放之後,對自身,伊娃,吸氣劑,制定者或任何其他需要這種(遞歸地)方法的引用可能會崩潰,或者更糟糕的是,隨機地破壞其他地方正在使用的內存。

純粹使用全局變量或局部變量(並且不需要對象進一步初始化或賦值)的方法可能是安全的,但這只是一個僞裝成實例方法的C函數或類方法。

相關問題