2010-10-21 15 views
0

我的应用程序将创建一个对象。该对象将持续运行其中一种方法,比如批处理图片。iphone - 如果我释放一个对象,而对象仍在运行它的一种方法时该怎么办?

如果它的方法正在运行,并且我释放该对象并且它被处置,那么iOs是否会自动处理对象的方法?例如,自动停止运行该对象的方法并避免bad_exec?

+1

您是否在后台/ nsoperation队列中使用多个线程/运行选择器/其他“运行”对象? – JosephH 2010-10-21 08:19:07

+0

请回答Joseph的问题。一般来说,不,操作系统不会为你做你的菜,如果你在一个方法内运行时,它的对象消失。在实践中,如果你遇到这种情况,那么在那之后,引用self或ivars就会炸毁。如果你没有任何这样的引用,那么它可能不应该是一种方法。 – 2010-10-21 08:27:56

+0

约瑟夫,我在一个线程中运行[obj performSelectorOnMainThread:@selector(method)wait:YES]。并且有可能在主线程外部释放此对象。 – Jack 2010-10-21 11:39:39

回答

1

当你调用release并且你的引用计数达到0时,你的对象的dealloc被调用。而已。

这意味着:如果你正在一个线程上处理并且你的对象被发送从另一个线程释放(或者出于其他一些不好的原因,同一线程),那么你应该预期未定义的行为(这可能导致终止, EXC_BAD_ACCESS或其他令人愉快的东西)。在这种情况下应该保持对对象的引用(例如,NSOperation子类)。

0

如果你释放一个对象,这意味着操作系统可以自由地重用内存并用其他数据覆盖它。因此,在对象的方法中,在最终释放之后,对自身,伊娃,吸气剂,制定者或任何其他需要这种(递归地)方法的引用可能会崩溃,或者更糟糕的是,随机地破坏其他地方正在使用的内存。

纯粹使用全局变量或局部变量(并且不需要对象进一步初始化或赋值)的方法可能是安全的,但这只是一个伪装成实例方法的C函数或类方法。

相关问题