2011-07-12 8 views
1

私はコードを最小限に抑えるためにUITableViewControllerをサブクラス化しようとしています。CoreDataとUITableviewControllerを使ったサブクラス化

私は基本的にスーパークラスのすべてのコードがFetchedResultControllerのために免除されています。これはサブクラスでオーバーライドされます。

この "分割"なしで動作しましたが、今度はEXC_BAD_ACCESSメッセージを返します。ここで

は、私のサブクラスのコードです:

- (NSFetchedResultsController *)fetchedResultsController 
    { 
     if (super.fetchedResultsController != nil) 
     { 
      return super.fetchedResultsController; 
     } 
     id delegate = [[UIApplication sharedApplication] delegate]; 

     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
     NSEntityDescription *entity = [NSEntityDescription entityForName:@"Question" inManagedObjectContext:[delegate managedObjectContext]]; 
     [fetchRequest setEntity:entity]; 

     [fetchRequest setFetchBatchSize:20]; 

     NSSortDescriptor*sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"up_vote_count" ascending:YES]; 
     NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
     [fetchRequest setSortDescriptors:sortDescriptors]; 

     //next line returns EXC_BAD_ACCESS 
     NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[delegate managedObjectContext] sectionNameKeyPath:nil cacheName:@"Root2"]; 
     aFetchedResultsController.delegate = self; 
     super.fetchedResultsController = aFetchedResultsController; 

     NSError *error = nil; 
     if (![self.fetchedResultsController performFetch:&error]) 
     { 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 

     return super.fetchedResultsController; 
    } 

私はスーパーを使用する必要がある場合、私は好奇心が強いです。または自己しかし、自己。がifステートメントでクラッシュしました。

- EDIT -

ここはスーパークラスの@interfaceです。私のサブクラスには、上書きされたメソッド以外は何も含まれていません。

@interface CoreDataTableView : UITableViewController <NSFetchedResultsControllerDelegate> { 


} 

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath; 

@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController; 
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 
@end 

答えて

2

自己。 if文でクラッシュしました

これは、再帰的にfetchedResultsControllerメソッドを無限ループに呼び出すためです。

その他の問題がいくつかあります。

  1. データまた、あなたのfetchRequestがリリースされることはありません

をフェッチフェッチ結果コントローラ

  • を初期化:

    まず、私は2部に方法があること分割を示唆しています。 aFetchedResultsControllerもありません。そのメソッド内でこれらのオブジェクトの両方を所有しているので、漏れを防ぐためにこれらのオブジェクトを解放する必要があります。これらの発言に基づいて

    は、ここでのコードがどのように見えるかです:selfsuperを使用するよう

    - (NSFetchedResultsController *)fetchedResultsController 
    { 
        // In this method, because it's overriding the accessor in the super-class, 
        // you must use |super.fetchedResultsController|, 
        // otherwise you will trigger an infinite loop! 
    
        if (super.fetchedResultsController != nil) 
        { 
         return super.fetchedResultsController; 
        } 
        id delegate = [[UIApplication sharedApplication] delegate]; 
    
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
        // ... 
    
        // omitted the other details...  
    
        NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[delegate managedObjectContext] sectionNameKeyPath:nil cacheName:@"Root2"]; 
        aFetchedResultsController.delegate = self; 
        super.fetchedResultsController = aFetchedResultsController; 
    
        [aFetchedResultsController release]; 
        [fetchRequest release]; 
    
        return super.fetchedResultsController; 
    } 
    
    
    - (void)fetch 
    { 
        NSError *error = nil; 
        // using |self| here is OK, because you're referring to the current object's method 
        if (![self.fetchedResultsController performFetch:&error]) 
        { 
         NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
         abort(); 
        }   
    } 
    

    • super.fooまたは[super foo]開始 スーパー方法fooを探しにクラス
    • self.fooまたは[self foo]は、方法を探します。あなたのケースでは 現在のオブジェクトのクラス

    では、それは私が前に述べたように、アクセサの内部で使用されている場合self.fetchedResultsControllerは、無限ループを誘発するという事実を除いて、多くの違いをすることはないだろう。

    私はこの権利を得て、それがあなたのために物事をクリアしたことを希望します...

  • +0

    ありがとう!リリースはARCでは許可されていないので、削除しました。それはもはやクラッシュしませんが、メソッドの設定セルは決して呼び出されません。私がcellForRowattIndexPath(スーパークラス内)に奇妙なNSLogを置くと、起動時にアプリケーションがクラッシュします。それが指している行は、管理オブジェクトクラス(完全に前に働いていた)にあります。 –

    +0

    私が見ることができるから、スーパークラスではテーブルビューのデリゲートメソッドが呼び出されていません。私はxibインターフェイスが必要ですか、それともUITableViewを宣言していますか? –

    +0

    TableViewControllerの@interface宣言を見れば、私はあなたの質問に答えることができます。あなたはそのコードを投稿できますか?どちらの方法でも、UITableViewControllerはデータを表示するためにUITableViewを必要とします。そのテーブルビューを(コードまたはXIBファイルで)どのように定義しても、UITableViewDelegateとUITableViewDataSourceの両方をUITableViewControllerを指すように設定してください。 – octy

    関連する問題