0

UITableViewのコミットで、次のコードを使用してオブジェクトを削除します。

[_context deleteObject:[_StudiessList objectAtIndex:indexPath.row]];
NSError *error; 
if (![_context save:&error]) {
    // Handle error
    NSLog(@"Unresolved error series %@, %@", error, [error userInfo]);
}
 [self LoadData]; // bad access fire here

LoadDataテーブルビューを補充する関数はどこにありますか

そのコードは次のとおりです。

iPaxeraAppDelegate *appDelegate = (iPaxeraAppDelegate *)[[UIApplication sharedApplication] delegate];
self.context = appDelegate.managedObjectContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"Studies" inManagedObjectContext:_context];
[fetchRequest setEntity:entity];
NSArray *sortDescriptors = [NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"StudyDate" ascending:YES] autorelease]]; 
[fetchRequest setSortDescriptors:sortDescriptors];

NSError *error;
@try {  
    // error done here exactly at fetch 
    self.StudiessList = [_context executeFetchRequest:fetchRequest error:&error];  
}
@catch (NSException * e) {
    NSLog(e);
}
[fetchRequest release];
[StudiessList retain];

LoadDataクラッシュするexecuteFetchRequest:

4

1 に答える 1

0

あなたの問題はおそらくここにあります:

NSArray *sortDescriptors = [NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"StudyDate" ascending:YES] autorelease]]; 

明示的な自動解放をアタッチすることにより、ソート記述子がまだ必要なときに割り当てを解除できる状況を設定します。フェッチがソート記述子を取得しようとすると、オブジェクトが存在しないためにクラッシュします。

明示的な自動解放は、それらが定義されている直近のスコープのメモリ プールの枯渇と密接に関連しているため、問題を引き起こす可能性があります。ランタイムは、「私はこのオブジェクトを完全に使い果たしたので、それがどうなろうと気にしません」と伝えます。オブジェクトの処理が完了していないと、問題が発生します。

コンビニエンス メソッドから暗黙的な autorelease を使用すると、この問題が解消されます。これは、オートリリースが別のスコープ (コンビニエンス メソッドを保持するクラス オブジェクトなど) で発行されるためです。その後、ローカル スコープに入り、ローカル スコープで自動解放されて強制終了されることを心配することなく保持できます。

試す:

NSArray *sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"StudyDate " ascending:YES]];

...そして、それがクラッシュを解決するかどうかを確認してください。

于 2011-03-31T15:09:23.167 に答える