2009-07-31 87 views
0

我想動態地從UIView中移除一個UILabel。有一些分支和循環,最後當我通過'removeFromSuperview'sdk崩潰刪除它,因爲它不再存在,在某些情況下。如何刪除只有在iPhone SDK上存在的對象?

[lbl_timer removeFromSuperview]; 

所以我想要的只是如何知道對象是否存在?

感謝

回答

0

你真的需要澄清你的意思是「存在」,你可以用各種方式來解釋。

在這種情況下,您可能會發現對象的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]; 
    } 
} 
+0

感謝您的回覆。 有一個父視圖,但我想知道它是否已經刪除,我認爲它在第二次刪除時崩潰了。我還有另一個全局變量,我用它作爲標誌,因爲它很緊急。 我會着眼於內存管理,'nil'對我來說是一個新想法。再次感謝 – pMan 2009-08-03 06:47:34

1

如果「存在」你的意思是「還沒有被釋放,」有沒有辦法做到這一點。對象所在的內存可能已被替換爲新對象。但是,如果該對象已被釋放,則它必須已從其超級視圖中移除,因爲超級視圖將保留對其的引用。

如果你是做釋放的人,那麼你可以在發佈之後立即將lbl_timer設置爲nil,以便-removeFromSuperview發送到一個零對象,並且什麼也不做。如果這是不可能的,你應該給我們看一些代碼。

+0

您應該始終始終始終將值設置爲零,最後一次釋放它之後。這主要是在dealloc中 - 確保將參考設置爲零。 – 2009-08-04 21:09:20