ARC,核心数据和多线程,ARC发布对象

时间:2012-02-25 21:48:26

标签: objective-c multithreading automatic-ref-counting

如何告诉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获取数组。

4 个答案:

答案 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发布核心数据对象。