从后台线程访问实例变量

Sno*_*man 3 iphone multithreading objective-c ios

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

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

[self dismissModalViewController]; //this releases all instance variables, right?
Run Code Online (Sandbox Code Playgroud)

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

另一件事:此MyObject被插入到托管对象上下文backgroundThread中.这是否意味着即使在解除视图后,此NSManagedObjectContext仍将保留该对象?

我正在使用ARC.

tor*_*ons 5

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

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

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

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