从后台线程访问实例变量



假设我有一个已分配和初始化的实例变量MyObject。然后说我这样做:

[backgroundThread performBlock:^{
    //do something with MyObject that might take some time
}];
[self dismissModalViewController]; //this releases all instance variables, right?

因此,我有一个名为backgroundThreadNSManagedObjectContext,它可以在后台对对象进行一些工作。这会立即返回并在后台完成工作,然后调用 dismissModalViewController,这会解除分配所有实例变量。那么,如果模态视图现在已经被关闭,但backgroundThread仍然需要使用对象怎么办?这是一个问题吗?解决方法是什么?

还有一件事:这个MyObject入到托管对象上下文backgroundThread中。这是否意味着此 NSManagedObjectContext 将保留该对象,即使在关闭视图之后也是如此?

我正在使用 ARC。

这里有几件事需要考虑。首先请记住,块将捕获它所引用的任何内容。因此,您可能不需要执行任何特殊操作,并且您的代码将正常工作,具体取决于您在块中执行的操作。块捕获的规则在 Apple 的块编程主题文档中进行了描述,如何处理每个变量取决于其类型。特别

在手动引用计数的环境中,复制块时会保留块内使用的局部变量。在块中使用实例变量将导致保留对象本身。如果要覆盖特定对象变量的此行为,可以使用 __block 存储类型修饰符对其进行标记。

如果使用 ARC,则对象变量会在复制块并稍后释放时自动保留和释放。

要考虑的另一件事是,对实例变量的访问可能是线程安全的,也可能不是线程安全的。通过声明为 atomic 的属性访问实例变量是朝着正确方向迈出的一步,但您可能需要使用互斥锁或其他技术来同步访问,具体取决于具体情况。

如果要引用(模态)视图控制器的 ivars 或其他属性,则需要确保模态视图控制器仍然存在。

以下是Apple关于dismissModalViewControllerAnimated:的文档中的一个可能有用的提示:

如果要保留对接收方呈现的视图的引用 控制器,在 modalViewController 属性之前获取值 调用此方法。

另一个可能可行的想法是创建并实例化一个单独的对象,该对象封装了要从视图控制器或任何其他线程访问的数据/对象。

最新更新