如何告诉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
}
从Core Data获取数组。
答案 0 :(得分:2)
我遇到与ARC相同的问题并使用FetchResultController获取结果。 我首先加载记录然后我用它们提供tableView,它在第一次进展顺利 但是当我滚动或选择任何行时,数组中的托管对象变为“nil”。
原因是:我忘记了我正在创建的包含我需要的所有核心数据提取的对象的小__strong。
答案 1 :(得分:1)
您需要在NSSomeOperation
。
如果您正在使用房产:
@property (nonatomic, strong) SomeObject *value;
如果你正在使用ivar:
__strong SomeObject *value;
查看转换guide for ARC。
答案 2 :(得分:1)
使用块来保持对数组的强引用并使用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
}
}
答案 3 :(得分:0)
问题是我正在尝试在线程之间共享托管对象。 CoreData不是线程安全的,您需要使用单独的上下文并为每个线程获取托管对象。 ARC发布核心数据对象。