1

私のiPhoneアプリで何か奇妙なことが起こっています。Core Data を使用して SQLite データベースにデータを保存しています。アプリの起動後初めて、テーブルを読み取ってすべての行を返し、ユーザーが選択できるもののリストを UITableView に入力しようとしました。リストの一番上の項目を選択すると、EXC_BAD_ACCESS 例外が発生します。彼らが他のアイテムを選択した場合、すべて問題ないようです。コード サンプルは次のとおりです。Sport と Team は NSManagedObjects です。sports は、NSFetchedResultsController (fetchedObjects) を使用してフェッチされた Sport オブジェクトの NSArray です。オブジェクトのリストを UITableView に表示できます (問題なく cellForRowAtIndexPath() 呼び出しに同じ配列を使用します)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    Sport *sport = (Sport *)[sports objectAtIndex:indexPath.row];

    if (teamSetup) {
        if (team.sport != sport) {
            [team setSport:sport]; <-- this is where the EXC_BAD_ACCESS happens

            NSError *error;
            [team.managedObjectContext save:&error];
        }
        [self.navigationController popViewControllerAnimated:YES];

    } else {
        // .. do some other stuff

    }
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

更新: EXC_BAD_ACCESS エラーがスローされるまで、最初のレコードではなく、NSArray の最後のレコードにのみ影響するようです。アプリを再起動すると、問題はなくなり、コードは期待どおりに機能します:(

4

1 に答える 1

0

上記の行の発生場所に問題はありませんEXC_BAD_ACCESS。ただし、teamまたはsportオブジェクトのいずれかに問題があるという手掛かりが得られる可能性があります。最初に追求すべき手段は、それらのオブジェクトの 1 つが十分に保持されていないために割り当て解除されたことです。

解放されたオブジェクトは、すぐには割り当て解除されない場合があります。そのため、EXC_BAD_ACCESS奇妙なタイミングで発生する可能性があります。オブジェクトは、使用していたメモリのチャンクが不要になった場合にのみ解放されます。もちろん、他のオブジェクトは同じチャンクを使用します。したがって、そのチャンクが割り当て解除の対象になると、開発者としては制御できなくなります。それはランタイムによって処理されます。

最善の方法は、まずアナライザーを実行し、次にインスツルメントを実行し、Leaks インストゥルメントでプロファイリングすることです。

EXC_BAD_ACCESSLou Franco のサイトには、これらすべての優れた説明と、エラーを追跡するためのポイントごとのアドバイスがあります。

EXC_BAD_ACCESS について

于 2011-11-09T11:40:16.857 に答える