Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone __在dispatch_sync中阻止和分配对象_Iphone_Objective C_Grand Central Dispatch - Fatal编程技术网

Iphone __在dispatch_sync中阻止和分配对象

Iphone __在dispatch_sync中阻止和分配对象,iphone,objective-c,grand-central-dispatch,Iphone,Objective C,Grand Central Dispatch,我想返回一个数组,其内容是在dispatch_sync块期间设置的 我通常看到的代码是这样的: -(NSArray *)getSomeLockedList { __block NSArray *resultList; dispatch_sync(myQueue, ^{ // copy contents of my ivar NSMutableArray into return variable resultList = [ivarCont

我想返回一个数组,其内容是在dispatch_sync块期间设置的

我通常看到的代码是这样的:

-(NSArray *)getSomeLockedList {

    __block NSArray *resultList;

    dispatch_sync(myQueue, ^{   
       // copy contents of my ivar NSMutableArray into return variable  
       resultList = [ivarContentList copy]; 
    });

    // add auto-release since a 'copy' was done within block
    return [resultList autorelease]; 
}
如果我没有复制完整数组,而是希望逐个添加,我可以跳过返回值上的“自动释放”吗

-(NSArray *)getSomeLockedList {

    __block NSArray *someResultKeys; // is it ever safe to do the alloc here?

    dispatch_sync(myQueue, ^{       
       someResultKeys = [NSMutableArray array];

    for (id entry in ivarContentList) {

          // do some work on entry instance
          [someResultKeys addObject:entry];     
       }        
    });

    return someResultKeys; // autorelease not necessary?
}

[NSMutableArray]分配在dispatch_sync块内是否安全,以便在该方法的堆栈完成后继续使用结果?

否,这不安全。问题是,当您分派到队列上时,当该队列的NSAutoreleasePool耗尽时,将收集该队列上自动释放的任何对象。你无法控制这将在何时发生。考虑这一点的适当方式是,始终假定在块在队列上完成执行时,自动释放池将耗尽

在您的情况下,正确的处理方法是使用

someResultKeys = [[NSMutableArray alloc] init];

在队列中,然后在调度同步后调用
[someResultKeys autorelease]

只需编写一个块变量,就可以轻松地避免使用块变量

NSMutableArray* someResultKeys = [NSMutableArray array];

在街区外。然而,我想知道的调度同步。您知道dispatch_sync将等待块完成执行吗?(对于串行队列,这意味着在它完成执行之前的所有块)。你不直接调用代码有什么好的理由吗

或者在块之前创建可变数组,并在块中简单地向其添加项。在这种情况下,
someResultsKey
不必声明为
\uu block
,因为它不会在块中更改。@Daniel在这种情况下,这可能是更好的方法。