3

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

[backgroundThread performBlock:^{
    //do something with MyObject that might take some time
}];

[self dismissModalViewController]; //this releases all instance variables, right?

所以发生的事情是我有一个NSManagedObjectContext调用backgroundThread,它在后台对一个对象做一些工作。这立即返回并在后台完成工作,然后dismissModalViewController被调用,释放所有实例变量。那么,如果模态视图现在已被解除,但backgroundThread仍需要使用该对象怎么办?这是一个问题吗?解决方法是什么?

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

我正在使用ARC。

4

2 回答 2

5

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

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

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

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

于 2012-06-30T20:57:03.547 回答
1

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

这是来自Apple 文档dismissModalViewControllerAnimated:的一个潜在有用的提示:

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

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

于 2012-06-30T20:39:43.863 回答