0

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 
... 

答えて

3

あなたは非保持呼び出しを使用してエンティティを作成しました:

NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:[self managedObjectContext]]; 

そして、あなたはそれをリリースしました。

[entity release]; 

リリースを取り出します。これは、あなたがそれが過剰解放されたNSEntityDescriptionであったという事実に焦点を当てたときに見つけることは自明である。 1つの場所でしか使用しないので、間違いを見つけるのは簡単です。

+0

'NSFetchRequest'の' setEntity'メソッドはそれを保持しませんか? –

+1

Appleのメモリ管理ルールは次のとおりです。http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/MemoryMgmt/Articles/mmObjectOwnership.html – paulbailey

+0

これはあなたのビジネスではありません。それがNSFetchRequestのビジネスです。 NSFetchRequestがそれを保持していれば、それを解放するのはNSFetchRequestの責任です。あなたは保持したものだけを解放します( 'alloc'、' retain'または 'new'を呼び出すことによって)。 –

関連する問題