如何在iPhone SDK上存在对象时删除对象?

时间:2009-07-31 10:57:23

标签: objective-c iphone uilabel

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

[lbl_timer removeFromSuperview];

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

感谢

2 个答案:

答案 0 :(得分:1)

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

如果您是正在发布的人,那么您可以在发布后立即将lbl_timer设置为nil,以便将-removeFromSuperview发送给nil对象并执行没有。如果那是不可能的,你应该向我们展示一些代码。

答案 1 :(得分:0)

你真的需要澄清“存在”是什么意思,因为可以通过各种方式解释。

<击> 在这种情况下,您可能会发现对象的retainCount可能满足您对exists的定义。如果您不熟悉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不会先出现问题甚至可能更安全。

if (lbl_timer != nil) {
    if ([lbl_timer superview] != nil) {
        [lbl_timer removeFromSuperView];
    }
}