UINavigationController
内のUITableViewController
のサブクラス内にNSFetchedResultsController
があります。私がアプリケーションを実行すると、すべてが完全に最初の3回私はビューにアクセスして(それに行く、 '戻る'をクリックして、再びそれに行く)、4番目(常に)それは次のクラッシュ:NSFetchedResultsController initWithFetchRequestはEXE-BAD-ACCESS例外をスローします
-[NSEntityDescription subentitiesByName]: message sent to deallocated instance 0x8b09c80
ご協力いただければ幸いです。ここで
結果コントローラのための私のゲッターです:
- (NSFetchedResultsController*)eventsResultsController {
if (eventsResultsController_ == nil) {
NSFetchRequest *aFetchRequest = [[PADataContext sharedInstance] makeGetAllFetchRequestForEntity:@"PAEvent" sortedBy:@"when" ascending:NO];
// NOTE: crashes on this next line
NSFetchedResultsController *aFetchedResultsContorller = [[NSFetchedResultsController alloc] initWithFetchRequest:aFetchRequest managedObjectContext:[[PADataContext sharedInstance] managedObjectContext] sectionNameKeyPath:@"whenMonth" cacheName:@"AllEvent"];
self.eventsResultsController = aFetchedResultsContorller;
[aFetchedResultsContorller release];
}
return eventsResultsController_;
}
これは私が私のNSFetchRequest
を作成するために使用するコードです:
- (NSFetchRequest*)makeGetAllFetchRequestForEntity:(NSString*)entityName sortedBy:(NSString*)sortString ascending:(BOOL)ascending {
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];
if (sortString != nil) {
// add sorting information
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortString ascending:ascending];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
}
[entity release];
return fetchRequest;
}
コンテキストオブジェクトは、一度作成され、全体で保持されていますシングルトンでのアプリの存続期間
ビューコントローラがdealloc
を取得したときにeventsResultsController_
が解放されることを確認しました。スタックで
、私はそれがinitWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName
方法で墜落したと聞いてい:
#0 0x00f04057 in ___forwarding___
#1 0x00f03f22 in __forwarding_prep_0___
#2 0x00da1b4d in -[NSFetchedResultsController initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:]
#3 0x00008c94 in -[PAHistoryListTableView eventsResultsController] at PAHistoryListTableView.m:125
#4 0x00008a5b in -[PAHistoryListTableView loadData] at PAHistoryListTableView.m:52
#5 0x00008a2a in -[PAHistoryListTableView viewDidLoad] at PAHistoryListTableView.m:43
...
'NSFetchRequest'の' setEntity'メソッドはそれを保持しませんか? –
Appleのメモリ管理ルールは次のとおりです。http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/MemoryMgmt/Articles/mmObjectOwnership.html – paulbailey
これはあなたのビジネスではありません。それがNSFetchRequestのビジネスです。 NSFetchRequestがそれを保持していれば、それを解放するのはNSFetchRequestの責任です。あなたは保持したものだけを解放します( 'alloc'、' retain'または 'new'を呼び出すことによって)。 –