0

を使用してテーブルビューでデータを表示してNSFetchedResultsControllerいます。サーバーからデータが届いたら、sqliteデータベースにあるすべてのデータを削除する必要があります。

以下のコードを使用してデータベースからデータを削除すると、クラッシュすることがあります(常にではありません)。このエラーが発生します。

Execution_BAD-ACCESS(code = 2、address = 0x0)

この行に

if (![moc save:&saveError]) {

.h

@property (readonly, retain, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, retain, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, retain, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

.m

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

NSManagedObjectContext *moc = [delegate managedObjectContext];

NSFetchRequest * allCategories = [[NSFetchRequest alloc] init];
[allCategories setEntity:[NSEntityDescription entityForName:@"Categories" inManagedObjectContext:moc]];
[allCategories setIncludesPropertyValues:NO]; //only fetch the managedObjectID

NSError * error = nil;
NSArray * dataArray = [moc executeFetchRequest:allCategories error:&error];

//error handling goes here

[NSFetchedResultsController deleteCacheWithName:@"RootDetail"];

for (Categories *cat in dataArray) {
    [moc deleteObject:cat];
}

NSError *saveError = nil;      
if (![moc save:&saveError]) {
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}

[allCategories release];

よく調べてみると、この問題は、DetailPageControllerにアクセスして戻ったときに(UINavigationController popNavigationController :を使用して)発生していることがわかりました。その後、DetailPageControllerを要求すると、クラッシュします。

次のエラーを与える -[DetailPageController controllerWillChangeContent:]:割り当て解除されたインスタンス0x11f52a90に送信されたメッセージ*


問題はNSManageObjectContextにあります。したがって、修正は常にNSManageObjectContextの新しく作成されたオブジェクトを使用することです。そうしないと、問題が発生します。


4

2 に答える 2

2

あなたのコメントに基づいて

操作キューを使用しています。だから私はメインスレッドにデータを入力します。2.各スレッドはコンテキストのインスタンスを分離する必要があると言っています。しかし、コンテキストのメインインスタンスは1つだけである必要があると思います。

いいえ。CoreDataとの同時実行に関するドキュメントに従わなければなりません

スレッドごとに個別の管理対象オブジェクトコンテキストを作成し、単一の永続ストアコーディネーターを共有します。これは通常推奨されるアプローチです。

また

スレッドごとに個別の管理対象オブジェクトコンテキストと永続ストアコーディネーターを作成します。このアプローチでは、複雑さが増し(特に、異なるコンテキスト間で変更を伝達する必要がある場合)、メモリ使用量が増える代わりに、同時実行性が向上します。

また

新しいCoreDataAPIを使用します。

元の質問

クラッシュに関するその他の詳細を提供していただければ、私たちがお手伝いできると思います。どうdelegateですか?

それまでの間、いくつかのヒントがあります。

1)Xcodeでゾンビを有効にする

XcodeでNSZombieを有効にする方法は?

2)適切なコンテキストを使用する

なぜ次のものを使うのですか?

NSManagedObjectContext *moc = [delegate managedObjectContext];

使用するだけ

NSManagedObjectContext *moc = [self managedObjectContext];

これが問題の原因である可能性があります。しかし、詳細がなければ、私にはよくわかりません。

したがって、このコントローラを外部から作成する場合は、管理対象オブジェクトのコンテキストプロパティを正しく設定してください。

yourController.managedObjectContext = theContextYouWantToShare;

3)エラー処理

NSError * error = nil;
NSArray * dataArray = [moc executeFetchRequest:allCategories error:&error];
if(dataArray) {
    // manage objects here...
} else {
    // handle error here...
}
于 2013-03-16T14:46:39.683 に答える
0

flexaddictedによる答えは非常に良いです(残念ながらまだコメントできません)が、マルチスレッドアプリケーションを使用している場合は非常に注意することを忘れないでください(質問でサーバー呼び出しについて言及しています)。各スレッドが独自のコンテキストを使用していることを確認してください。そうしないと、問題が発生します。これは、AppleのCoreDataドキュメントに詳しく記載されています。

または、少なくとも、コアデータを使用して何かを行うための呼び出しがメインスレッド上にあることを確認してください(ただし、長い操作を実行するとブロックされる可能性があるため、これは理想的ではありません)。

于 2013-03-16T15:59:54.703 に答える