2012-03-15 16 views
0

私は自分のmocから結果を得るのを助けるために、NSManagedObjectContextカテゴリの中に単純な関数を持っています。私は、mocインスタンスから提供されたperformBlockAndWaitブロックの中で結果を実行しています。私はオートレリースされた配列を返す必要があり、通常はmocのexecuteFetchがそれを行います。しかし、この場合は、__blockディレクティブで配列を宣言しても、ブロック内に配列を保持する必要があります。ブロックが終了すると解放されるようです。 これは正常ですか? ありがとうございます。ブロック内の変数の理解(__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]; 

}

+2

Re。あなたのretainCountの使用:http://www.whentouseretaincount.com/ –

+0

@StephenDarlington - ついに!決定的なリファレンスリンク! – jrturton

+0

jajaja excellent –

答えて

3

私はperformBlockAndWaitブロックの内部自動解放プールラッピングの実行を持っていると思われます。そのため、ブロックを離れるとexecuteFetchRequest:error:によって返された配列が解放されます。そのため、ブロックを保持する必要があります。

これはARCでは問題ではないことに注意してください。 arrayポインタは自動的に配列を保持します。オプションがある場合は、ARCに切り替えることをおすすめします。しかしその間に、今あなたは何が起こっているのか知っています。

+0

また、MOCの並行性のタイプによっては、ブロックが同じスレッド上で実行されないこともあります。 –

+0

NSMainQueueConcurrencyTypeを使用していますが、メインスレッドから呼び出しているので、同じものでなければなりません。 –

関連する問題