iphone - 测试对象是否存在

问题描述:

我的应用程序中有几个对象可以在某些时候变为零,并且我有一些理论上用于将这些对象置零的方法。iphone - 测试对象是否存在

但是,如果我试图放弃一个不存在的对象,应用程序将崩溃。

例如...

[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

你的意思是“object1”处处有“对象”吗?我假设如此。 – itsmatt 2010-04-07 16:39:22

+0

我已经澄清了原来的问题。谢谢。 – SpaceDog 2010-04-07 16:51:52

+0

您正在混合使用术语指针,引用和对象。这些术语具有非常不同的含义。如果你不了解它们之间的差异,它会帮助你阅读C编程。如果你确实了解它们,那么如果你更加注意自己的用法,它会对你的读者有所帮助。因为这个,你的帖子有点难以阅读。 – glorifiedHacker 2010-04-07 17:06:54

总之,您确定指针是否仍然有效的问题正在走向错误的路径。

释放对象后,必须立即将其值设置为null,以便不再控制它。如果两个方法正在异步访问同一个对象,那么它们必须在那时同步,以便在另一个线程中发布和设置为null的同时发生在另一个线程有机会中断之前。

+0

我已澄清原始问题。谢谢。 – SpaceDog 2010-04-07 16:51:11

你只是猜测,或者你真的尝试过吗?因为在其他编程语言中,在nil上调用方法会导致崩溃。在Objective-C中,这不是真的。在Objective-C中,您可以将消息发送到零而不会导致崩溃。这些消息根本没有效果。

事实上,你可真猥亵并执行以下操作不崩溃:

[(id)nil setTitle:@"Testing"]; // This will not cause a crash 

如果您的应用程序崩溃,这是不是因为你是邮件为零。但是,您可能无法将指针设置为零,并且您正在传递内存中不属于您的对象。考虑到您在更新中提供的细节,即您有一个异步线程访问这些对象,我认为您很可能将消息发送给其对象已被释放但尚未设置为零的指针。

+0

谢谢。我不是在猜测。我现在看到的问题不是针对nil进行测试,而是在测试之前测试引用的有效性。想象一下,指向已释放视图的引用。该引用是有效的,但它引用的对象不是。 – SpaceDog 2010-04-07 23:48:08

我比较了一个对象之前零没有任何问题。

+0

谢谢。我现在看到的问题不是针对nil进行测试,而是在测试之前测试引用的有效性。想象一下,指向已释放视图的引用。该引用是有效的,但它引用的对象不是。无论如何感谢您的回答。努力帮助:-) +1 – SpaceDog 2010-04-07 23:49:17