Iphone __在dispatch_sync中阻止和分配对象
我想返回一个数组,其内容是在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
-(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在这种情况下,这可能是更好的方法。