我想动态地从 UIView 中删除一个 UILabel 。有一些分支和循环,最后当我通过“removeFromSuperview”删除它时,sdk 崩溃,因为它不再存在,在某些情况下。
[lbl_timer removeFromSuperview];
所以我想要的只是如何知道一个对象是否存在?
谢谢
我想动态地从 UIView 中删除一个 UILabel 。有一些分支和循环,最后当我通过“removeFromSuperview”删除它时,sdk 崩溃,因为它不再存在,在某些情况下。
[lbl_timer removeFromSuperview];
所以我想要的只是如何知道一个对象是否存在?
谢谢
如果“存在”是指“尚未被释放”,则没有办法做到这一点。对象所在的内存可能已被新对象替换。但是,如果对象已被释放,则它必须已从其父视图中删除,因为父视图将保留对它的引用。
如果您是执行发布的人,那么您可以在发布后立即设置lbl_timer
为nil
,以便将-removeFromSuperview
其发送到 nil 对象并且什么都不做。如果那不可能,您应该向我们展示一些代码。
你真的需要澄清你所说的“存在”是什么意思,因为它可以用各种方式来解释。
在这种情况下,您可能会发现对象的 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];
}
}