2013-07-05 65 views
3

我有一组对象,init'd和视图控制器拥有。视图控制器在这些对象中的每一个中启动一个fetchData方法,这些对象在后台线程中运行,然后在完成时返回主线程并更改视图控制器正在观察的属性 - self.dataFetchComplete对象在运行后台线程时解除分配时发生崩溃

dispatch_async(dispatch_get_main_queue(), ^{   
    self.dataFetchComplete = YES; 
}); 

如果这些对象是用这种方法完成之前视图控制器被释放,当它击中self.dataFetchComplete = YES;线,它崩溃。

如何在释放后试图更改此属性时阻止它崩溃。

编辑:更多信息和清晰度。

+0

您需要提供更多的上下文和代码。如果你的对象被提前解除分配(并且你知道**它是故意发生的),那么你的设计问题就很糟糕。 – 2013-07-05 18:18:39

+0

请说明“如果在返回主队列之前将对象解除分配,尝试设置此属性时会引发错误。”太多代名词。什么对象?什么回来之前?什么引发错误?你在使用ARC吗? –

+1

该块应该捕获(并保留)自我,因此如果它被释放,那么在其他地方有一个错误会过度释放它。 –

回答

1

该块有很强的参考selfself可以被解除分配的唯一方法是如果你在其他地方过度释放它(如@Catfish_Man所示)。

  1. 如果你有一个碰撞,后碰撞

  2. 的回溯,如果你有一个过放崩溃,用仪器跟踪的对象都保留/释放事件。

  3. 运行分析仪并修复它表明的任何问题。