2012-02-25 10 views
1

ARCに指示する方法は、別のスレッドで使用されているメインスレッドのオブジェクトを解放しませんか? 放すのを防ぐには?ARC、コアデータとマルチスレッド、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 
} 

アレイはコアデータからフェッチされます。

+0

あなたはカスタムNSOperationを持っているか、実際にはNSOperationで 'initWithValue:'を呼び出していますか? – gcamp

+0

カスタム。私は質問のテキストを更新しました。 –

+1

あなたの問題はARCではなく、管理されたオブジェクトをスレッド間で共有しようとしているという事実です。 CoreDataはスレッドセーフではないため、別のコンテキストを使用して、スレッドごとに管理オブジェクトをフェッチする必要があります。 – Rog

答えて

2

私は、FetchResultControllerを使用してARCと結果をフェッチするのと同じ問題があります。 最初にレコードをロードしてからtableViewをフィードします。最初は になりますが、スクロールしたり、行を選択したりすると、配列内の管理対象オブジェクトは「なし」になります。

原因は次のとおりです。私が必要とするすべてのコアデータフェッチが含まれているオブジェクトの小さな__strongを忘れました。

+1

解決済み!私は私が必要とするすべてのコアデータフェッチが含まれているオブジェクトを作成するための小さな__strongを忘れていました:) – DigitalVanilla

1

NSSomeOperationにそのオブジェクトへの強い参照が必要です。

、プロパティを使用している場合:

@property (nonatomic, strong) SomeObject *value; 

をおIVARを使用している場合:

__strong SomeObject *value; 

は移行guide for ARCを見てください。

+0

ありがとうございます、私はすでにこれを使用していますが、それは役に立ちません。配列はコアデータからフェッチされます。私は質問のテキストを更新しました。 –

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 
    } 
} 
+0

ありがとう、私は以前これを使ったことはありません。しかし、良いデザインのソリューションではありません。 NSOperationの使用がより好ましい。処理の本体が非常に大きくなる可能性があるためです。 OOPがより好ましい。 –

+0

@igelekleブロックとGCDをもう一度見てください。彼らについての非OOPは何もない。 – Abizern

+0

Okey、私は今GCDを学んでいます、それはnsoperationsよりもはるかに速いようです。私は、Blockは小規模な操作をインライン展開するためのコードの小さな部分に使用できると思います。より複雑な処理のためには、nsperationsとGCDはずっと良いと思います。私はこの問題を解決しました。上記の私のコメントを参照してください。 –

0

問題は、私が共有しようとしているありますスレッド間でオブジェクトを管理します。 CoreDataはスレッドセーフではないため、別のコンテキストを使用して、スレッドごとに管理オブジェクトをフェッチする必要があります。 ARCはコアデータオブジェクトをリリースします。

関連する問題