Objective c 理解块中的变量(_块指令)

Objective c 理解块中的变量(_块指令),objective-c,core-data,objective-c-blocks,Objective C,Core Data,Objective C Blocks,在NSManagedObjectContext类别中有一个简单的函数,可以帮助我从moc中获得结果。我正在moc实例提供的performBlockAndWait块内执行结果。我需要返回一个自动释放的数组,通常moc的executeFetch已经返回了。但在这种情况下,我需要将数组保留在块内,即使我使用_block指令声明数组。它看起来像是在块完成后释放的。 这正常吗? 多谢各位 -(NSArray*)executeFetchWithEntityName:(NSString*)entityName

在NSManagedObjectContext类别中有一个简单的函数,可以帮助我从moc中获得结果。我正在moc实例提供的performBlockAndWait块内执行结果。我需要返回一个自动释放的数组,通常moc的executeFetch已经返回了。但在这种情况下,我需要将数组保留在块内,即使我使用_block指令声明数组。它看起来像是在块完成后释放的。 这正常吗? 多谢各位

-(NSArray*)executeFetchWithEntityName:(NSString*)entityName predicate:(NSPredicate*)predicate{
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:self];
if (!entity) {
    NSLog(@"entity is nil in executeFetchWithEntityName: %@", entityName);
    return [[[NSArray alloc]init]autorelease];
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
[fetchRequest setEntity:entity];
if(predicate){
    [fetchRequest setPredicate:predicate];   
}
__block NSError *error = nil;
__block NSArray *array = nil;
[self  performBlockAndWait:^{
    array = [self executeFetchRequest:fetchRequest error:&error];
    [array retain]; <------ IF I DONT RETAIN HERE, IT CRASHES FURTHER ON
}];

NSLog(@"retain count: %i", array.retainCount);

if (error) {
    NSLog(@"error");
    array = nil;
}

[fetchRequest release];
return [array autorelease];
-(NSArray*)executeFetchWithEntityName:(NSString*)entityName谓词:(NSPredicate*)谓词{
NSEntityDescription*实体=[NSEntityDescription entityForName:entityName inManagedObjectContext:self];
如果(!实体){
NSLog(@“实体在executeFetchWithEntityName:%@”entityName中为零);
返回[[[NSArray alloc]init]autorelease];
}
NSFetchRequest*fetchRequest=[[NSFetchRequest alloc]init];
[FetchRequestSetEntity:entity];
if(谓词){
[FetchRequestSetPredicate:谓词];
}
__块N错误*错误=nil;
__块NSArray*数组=零;
[自动执行锁定和等待:^{
数组=[self-executeFetchRequest:fetchRequest错误:&error];

[array retain];我怀疑
performBlockAndWait
有一个内部自动释放池包装块的执行。因此,
executeFetchRequest:error:
返回的数组在您离开块时被释放,这就是您需要保留它的原因


请注意,这在ARC下不是问题;
array
指针将自动保留数组。如果您有此选项,我建议切换到ARC。但同时,现在您知道发生了什么。

我怀疑
performBlockAndWait
有一个内部自动释放池包装块的执行。A因此,当您离开块时,
executeFetchRequest:error:
返回的数组将被释放,这就是您需要保留它的原因


请注意,这在ARC下不是问题;
array
指针将自动保留数组。如果您有此选项,我建议切换到ARC。但同时,现在您知道发生了什么。

此外,根据MOC的并发类型,该块甚至可能不会在同一线程上执行。我使用NSMainQueueConcurrencyType,我从主线程调用,所以它必须是同一个…另外,根据MOC的并发类型,该块甚至可能不会在同一个线程上执行。我使用的是NSMainQueueConcurrencyType,我从主线程调用,所以它必须是同一个…Re.您使用的retainCount:@StephenDa林顿-终于!一个明确的参考链接!关于你对retainCount的使用:@StephenDarlington-终于!一个明确的参考链接!