如何告诉ARC不要在主线程中释放在另一个线程中使用的对象?如何防止释放?
-(void)someFunc
{
array = ... //fetching array of entities from a core data
for(SomeObject * obj in array)
{
NSSomeOperation * op = [[NSSomeOperation alloc] initWithValue:obj];
//start operation
}
//it seems here ARC release array and all items
}
数组是从核心数据中提取的。
我在ARC和使用FetchResultController获取结果方面也有同样的问题。我先加载记录,然后给它们提供一个tableView,它一开始就很好但当我滚动或选择任何一行时,数组中的托管对象将变为"nil"。
原因是:我忘记了我正在创建的对象的一个小__strong,它包含了我需要的所有核心数据获取。
您需要在NSSomeOperation
中具有对该对象的强引用。
如果您正在使用属性:
@property (nonatomic, strong) SomeObject *value;
如果您使用的是ivar:
__strong SomeObject *value;
查看ARC的转换指南。
与其麻烦地保留对数组的强引用并使用NSOperation评估每个元素,您可以使用块获得类似的并发枚举:
-(void)someFunc
{
array = ... //get array from another function
[array enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
// Perform the operation on each obj in this block
// The blocks will run concurrently
}
}
问题是我试图在线程之间共享托管对象。CoreData不是线程安全的,您需要使用一个单独的上下文并为每个线程获取托管对象。ARC发布核心数据对象。