0

我想动态地从 UIView 中删除一个 UILabel 。有一些分支和循环,最后当我通过“removeFromSuperview”删除它时,sdk 崩溃,因为它不再存在,在某些情况下。

[lbl_timer removeFromSuperview];

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

谢谢

4

2 回答 2

1

如果“存在”是指“尚未被释放”,则没有办法做到这一点。对象所在的内存可能已被新对象替换。但是,如果对象已被释放,则它必须已从其父视图中删除,因为父视图将保留对它的引用。

如果您是执行发布的人,那么您可以在发布后立即设置lbl_timernil,以便将-removeFromSuperview其发送到 nil 对象并且什么都不做。如果那不可能,您应该向我们展示一些代码。

于 2009-07-31T15:28:18.240 回答
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 输出甚至可能更安全。

if (lbl_timer != nil) {
    if ([lbl_timer superview] != nil) {
        [lbl_timer removeFromSuperView];
    }
}
于 2009-08-02T06:30:36.203 回答