objective-c - 当方法仍在运行时调用 Dealloc

标签 objective-c ios synchronized

在我正在处理的一个项目中(我选择了这段代码并且一直在尝试调试它),我有一个由观察者调用的函数。观察者调用一个方法来更新要放在屏幕上的数据。当此更新发生时(更新需要几秒钟的时间),用户可以按导航栏上的“后退”按钮,这会导致发生 dealloc 调用。当该方法运行时,dealloc 调用会释放所有 ivars,这最终会在该方法尝试访问 ivars 时导致 EXC_BAD_ACCESS。 update 方法的结构也包含在 @synchronized block 中。

- (void)update {

@synchronized(self){
  // some code here...
  // Also access ivars here.
  }

}

如何告诉 Controller 在释放之前先完成该方法?我尝试在 dealloc 中使用条件运行 while 循环,但这似乎效率不高。如果 Controller 被释放,它也永远不会完全执行,并处于死锁状态。我觉得解决办法很简单,但是我的大脑因为一整天的工作而疲惫不堪,无法思考。

最佳答案

您可以在 self 上调用 retain 以确保在运行时间较长的方法时引用计数不会达到零;并以这种方式避免释放:

- (void) update {
    [self retain]

    // do work ...

    [self release]
 }

关于objective-c - 当方法仍在运行时调用 Dealloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11127683/

相关文章:

ios - 如何使 SwrevealViewController 的 viewDidLoad 仅调用一次

ios - 如何使用可解码协议(protocol)为具有不同键的相同 Json 属性创建通用类

ios - 将RKObjectRequestOperation子类化以检查错误时,如何重试失败的操作?

ios - 我的应用程序崩溃,原因是“UITableView 数据源必须从 tableView :cellForRowAtIndexPath 返回一个单元格”

ios - 解析 rss 提要并将字符串附加到链接 - objective-c

ios - 为 UITableView 部分构建数据结构

java - 理解同步和实现队列

Java 基本同步线程

java - JUnit并发访问synchronizedSet

iphone - 创建一个核心日期实体实例但不希望它被存储(非持久性)