0

最初の免責事項: 私は Objective-C と保持モデルにかなり慣れていません。私は過去 5 年間、ガベージ コレクションされた .NET 環境で開発を行ってきたので、甘やかされてきました。まだ勉強してる。

EXC_BAD_ACCESS で iPhone アプリがクラッシュします。ナビゲーションコントローラー/テーブルビューのセットアップで発生します。初めて行を選択するときは問題ありません。子コントローラーで問題なく切り替わります。戻って同じ行をもう一度選択します。その後、プログラムはクラッシュします。他のすべての行は正常に動作しますが、行がアクセスされるたびにクラッシュします

これが発生する場所を特定しました。切り替え先の子コントローラー (同じタイプのすべての行で再利用するクラス) には、表示される行を表す NSString の配列があります。子ビューコントローラーをプッシュする前に設定しました。これが明らかに起こる場所です。

この問題をデバッグするのに苦労していますが、まだ xcode などと格闘しています。ここには重要な情報が欠けているのではないかと心配していますが、あなたが認識しているものがあるかもしれません.

4

2 に答える 2

2

NSZombies を有効にします。

http://www.cocoadev.com/index.pl?NSZombieEnabled

これは、過剰にリリースされているオブジェクト (おそらく何が起こっているのか) を特定するのに役立ちます。

于 2010-03-24T21:39:22.697 に答える
0

それで… [UINavigationController pushViewController] は保持されませんよね?;) 私がしたことは、ナビゲーションスタックにプッシュされるコントローラーを初期化/割り当て、プッシュしてから解放することでした。ナビゲーションコントローラーはコントローラーを保持すると思いました。どうやら、そうではありませんでした。最初にプッシュされたときは明らかに機能しましたが、2回目は機能しませんでした。メモリが本当に解放された場所だと思います。ゾンビを有効にすると、(セッターから) 割り当て解除されたオブジェクトへのメッセージを取得していたことが明らかになりました。

pushViewController がコントローラーを保持すると思ったのはなぜですか? 知らない; 割り当てた場合、割り当て解除にも責任があると思って混乱したと思います。押した後は、ナビコントローラーの責任だろうとなんとなく思った。私が間違っていたようです。

私はまだこの感覚をつかむことを学んでいます (邪悪な C# とガベージ コレクションは私の心を焼き尽くしました!)。追加するものはありますか?

説明のために、これは間違っていたようです:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     NSUInteger section = [indexPath section];
 NSUInteger row = [indexPath row];

 if (selectionController == nil)
 {
  selectionController =
   [[ConfigSelectionViewController alloc] initWithStyle:UITableViewStyleGrouped];
 }

 NSString *title = [self titleForSection:section row:row];
 NSString *key = [self keyForSection:section row:row];

 selectionController.configKey = key;
 selectionController.title = title;

 NSArray *listItems = [self itemsForSection:section row:row];
 selectionController.list = listItems;

 [self.navigationController pushViewController:selectionController animated:YES];

        // DON'T DO THIS!
        [selectionController release];


}
于 2010-03-29T21:08:54.053 に答える