2011-08-11 10 views
3

CoreDataを使用して選択した行の詳細を表示するつもりはありませんが、なぜ「BAD_ACCESS」エラーが発生するのかわかりません。私は周りをgoogledして、私が探しているものを見つけることができません。CoreData DetailTableView BAD_ACCESSエラー

基本的にCoreDataを使用して、テーブルビューのデータを設定します。すべてのエンティティのすべてのタイトル属性を取得します。ユーザーが行をクリックすると、そのエンティティの説明を表示する必要がある詳細ビューが表示されます。私は、新しいNSManagedObjectContextとDetailViewControllerの新しいNSFetchRequestのための新しいNSEntityDescriptionを作成し、NSPredicateを使って "where title = [user selected title]"と言う必要があると思います。私は行を選択するとエラーが発生します。コードを参照してください:

- (void)viewDidLoad 
{ 
    // Do any additional setup after loading the view from its nib. 

    // Get the objects from Core Data database 
    Caregiver_Activity_GuideAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *context = [appDelegate managedObjectContext]; 
    NSEntityDescription *entityDescription = [NSEntityDescription 
               entityForName:@"Definition" 
               inManagedObjectContext:context]; 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entityDescription]; 

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(title = %@)", self.title]; 
    [request setPredicate:pred]; 

    NSError *error; 
    NSArray *objects = [context executeFetchRequest:request error:&error]; 
    if (objects == nil) { 
     NSLog(@"There was an error!"); 
     // Do whatever error handling is appropriate 
    } 

    for (NSManagedObject *oneObject in objects) { 
     [definitionDescriptionTextView setText:[oneObject valueForKey:@"desc"]]; 
    } 

    [objects release]; 
    [request release]; 

    [super viewDidLoad]; 
} 

私はそのコードをすべてコメントします。しかし、ブレークポイントでデバッグしようとすると、何もキャッチしません。だから私はもっと混乱している。

私はCoreDataがおそらく私がやっていることに対して過度のものだと知っていますが、これは私のための学習アプリです。

EDIT:エンティティにあらかじめ入力されているsqliteデータベースを使用しています。

my github pageでプロジェクトをダウンロードすることもできます。

+0

問題が見つかりました。私がいなくていいはずの物体を解放していた。 A 非常にいいアップルデベロッパフォーラムのApple従業員は、私にはメモリ管理がわからず、私に標準的な800ページのApple Dev Memory Managementドキュメントへのリンクを教えてくれた。 – Miles

+0

Apple Devフォーラムの別のユーザーから、より良い回答が得られました:「違反は、この場合、あなたがいないはずの状況で呼び出していることです.Xcodeであなたに何を伝えたいかあなたのプロジェクトのクリーンなビルドを行い、 "Build&Analyze"オプションを使用してください。すべて正常に動作すれば、元のメッセージに投稿した方法に関する少なくとも1つの青いアイコンメッセージが表示されます。 私は彼に答えのポイントを与え、彼に感謝しました。 – Miles

答えて

1

通常、Core DataバックアップされたMaster-Detailインターフェイスでは、Detailビューをフェッチしません。

マスターテーブルビューで行を選択すると、特定の管理オブジェクトインスタンスが選択されます。その後、そのマネージオブジェクトインスタンスを詳細ビューに渡します。テーブルビューで選択したオブジェクトを再フェッチする必要はありません。

これは、連絡先アプリの良い例です。 Masterテーブルビューは、Contactオブジェクトのリスト(名前を表示)になります。行を選択すると、Masterテーブルビューコントローラは選択された行に関連付けられた特定のContactオブジェクトを取得し、詳細ビューコントローラに渡します。渡されたContactオブジェクトのプロパティから取得したデータを使用して表示します。

したがって、エラーが発生したコードブロック全体は不要です。

ただし、このコードの間違いは、作成していないオブジェクトをリリースしていることです。この行では:

NSArray *objects = [context executeFetchRequest:request error:&error]; 

...あなたはinitnewまたはcreate方法でNSArrayのインスタンスを作成していません。代わりに、あなたは単に、NSManagedObjectContextインスタンスcontextによって作成され返された自動リリースされたNSArrayインスタンスを受け取ります。あなたがここで作成していないオブジェクトをリリースするとき:

[objects release]; 

...あなたはクラッシュします。

逆に、あなたはここでNSFe​​tchRequestを作成します:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

...

[request relwase]; 

ところで、この種のコードは、メソッドとしてviewDidLoadに入れるべきではないビューがペン先からの最初の時間に読まれたときにのみ呼び出されます。あなたはinitを使用しているためので、あなたがそのバランスする必要がありますディスク上のファイル。これは、ユーザーが別のビューに切り替えたときにビューがメモリ内に残るため、一度発生することが保証されています。代わりに、ビューが表示されるたびに実行する必要のあるコードをviewWillAppearに入れてください。

+0

ありがとうTechZen - 素晴らしい説明! – Miles