我想動態地從UIView中移除一個UILabel。有一些分支和循環,最後當我通過'removeFromSuperview'sdk崩潰刪除它,因爲它不再存在,在某些情況下。如何刪除只有在iPhone SDK上存在的對象?
[lbl_timer removeFromSuperview];
所以我想要的只是如何知道對象是否存在?
感謝
我想動態地從UIView中移除一個UILabel。有一些分支和循環,最後當我通過'removeFromSuperview'sdk崩潰刪除它,因爲它不再存在,在某些情況下。如何刪除只有在iPhone SDK上存在的對象?
[lbl_timer removeFromSuperview];
所以我想要的只是如何知道對象是否存在?
感謝
你真的需要澄清你的意思是「存在」,你可以用各種方式來解釋。
在這種情況下,您可能會發現對象的retainCount可能會滿足您存在的定義。如果您不熟悉Objective-C的內存管理,只需知道一旦對象的retainCount達到0,它就會被釋放並且通常不再「存在」。
if ([lbl_timer retainCount] >= 1) {
// The object is owned/retained by at least one thing,
// assuming a parentview is an owner
[lbl_timer removeFromSuperview];
} else {
// The object isn't retained by anyone
}
這是誠實不是最可靠的還是 「安全」 的方法來檢查。
編輯:已經提出的一點是,在釋放對象上調用retainCount會導致崩潰。最好避免做這種檢查。堅持下面的方法應該更安全。
如果你知道它具體崩潰,因爲它沒有父視圖,你可能能夠檢查它是否有一個父視圖。
if ([lbl_timer superview] != nil) {
[lbl_timer removeFromSuperView];
}
此外:甚至可能會更安全,以確保lbl_timer不是第一nil'd出來。
if (lbl_timer != nil) {
if ([lbl_timer superview] != nil) {
[lbl_timer removeFromSuperView];
}
}
如果「存在」你的意思是「還沒有被釋放,」有沒有辦法做到這一點。對象所在的內存可能已被替換爲新對象。但是,如果該對象已被釋放,則它必須已從其超級視圖中移除,因爲超級視圖將保留對其的引用。
如果你是做釋放的人,那麼你可以在發佈之後立即將lbl_timer
設置爲nil
,以便-removeFromSuperview
發送到一個零對象,並且什麼也不做。如果這是不可能的,你應該給我們看一些代碼。
您應該始終始終始終將值設置爲零,最後一次釋放它之後。這主要是在dealloc中 - 確保將參考設置爲零。 – 2009-08-04 21:09:20
感謝您的回覆。 有一個父視圖,但我想知道它是否已經刪除,我認爲它在第二次刪除時崩潰了。我還有另一個全局變量,我用它作爲標誌,因爲它很緊急。 我會着眼於內存管理,'nil'對我來說是一個新想法。再次感謝 – pMan 2009-08-03 06:47:34