ARC,核心数据和多线程,ARC释放对象



如何告诉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发布核心数据对象。

最新更新