我的应用程序中有几个对象在某些时候可以变为零,我有理论上用于将这些对象设置为零的方法。
但是,如果我尝试将一个不存在的对象设置为nil,则应用程序将崩溃。
例如......
[object1 release];
object1 = nil;
// ......之后
[object1 removeFromSuperview]; // this will crash
然后我想,为什么不在删除之前测试对象是否存在...
if (object1 != nil)
[object1 removeFromSuperview];
// this will crash too, because object1 cannot be tested for nil because it does not exist
如果对象是否为零,我怎样检查对象是否存在?
if (object1 exists( {
if(object1 != nil))
[object1 removeFromSuperview)
}
这可能吗?
我加上澄清......
我的意思是:想象我在头上声明了object1并在代码上初始化了。因此,它存在并指向有效的参考。在某些时候,对象可能会被释放,因此引用仍然指向一个对象,但对象被释放。即使我在释放后把对象放到零,我也无法用它做任何事情。
问题是:我有一些异步的方法。其中一个扫描某些对象并在找到它们时将其删除。我必须检查对象是否存在,并且引用指向有效对象,然后再次释放它。这就是重点:如何在再次释放对象之前测试对象是否存在及其引用是否指向有效的现有对象,以及再次释放已释放的对象并使应用程序崩溃。
答案 0 :(得分:7)
简而言之,您确定指针是否仍然有效的问题正在走错路。
释放对象后,必须立即将其值设置为null,以便不再控制它。如果两个方法以异步方式运行访问同一个对象,则必须在该点同步它们,以便在另一个线程有机会中断之前,在一个线程中同时发布和设置为null。
答案 1 :(得分:2)
你只是猜测,还是你真的试过这个?因为在其他编程语言中,在nil上调用方法会导致崩溃。在Objective-C中,这不是真的。在Objective-C中,您可以将消息发送到nil而不会导致崩溃。这些消息根本没有效果。
事实上,你可能会非常淫秽并且在没有崩溃的情况下做以下事情:
[(id)nil setTitle:@"Testing"]; // This will not cause a crash
如果你的应用程序崩溃了,那不是因为你的消息是nil。但是,您可能无法将指针设置为nil,而是在内存中发送一个您不拥有的对象。鉴于您在更新中提供的详细信息,即您有一个访问这些对象的异步线程,我认为您很可能是将消息发送到其对象已被释放但尚未设置为nil的指针。
答案 2 :(得分:1)
我之前将对象与nil进行了比较,没有任何问题。