1

次の手順を実行すると、EXEC_BAD_ACCESS が発生します。

ステップ 1: メイン メニューから [スコア] ボタンをクリックします。 これにより、メニュー (UIView) が削除され、スコア (UIView) が読み込まれ、UITableView に値を設定するプロセスが開始されます。ここでは問題ありません。

            self.viewController4 = [[ScoresViewController alloc]  initWithNibName:@"ScoresViewController" bundle:nil];
        [window addSubview:viewController4.view];
        [viewController.view removeFromSuperview];
        NSLog(@"LOADING SCORES SCREEN");

ステップ 2: スコア画面から「メニュー」ボタンをクリックします。 これにより、スコア (UIView) が削除され、メニュー (UIView) が再度読み込まれます。ここでは問題ありません。

self.viewController = [[MainMenuViewController alloc] initWithNibName:@"MainMenuViewController" bundle:nil];
        [window addSubview:viewController.view];
        [viewController4.view removeFromSuperview];
        NSLog(@"Loading MAIN MENU");

ステップ 3: メイン メニューから [スコア] ボタンを再度クリックします。 これにより、メニュー (UIView) が削除され、スコア (UIView) が読み込まれ、UITableView に値を入力するプロセスが開始されます。問題あり!

スコア画面 (UIView) を表示する前にアプリケーションがクラッシュします。デバッガーを使用して、問題を 1 行のコードに突き止めました。cell.text = [self->theScoresArray objectAtIndex:indexPath.row]; 以下のルーチンに表示されます。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{   
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [theTable dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
cell.text = [self->theScoresArray objectAtIndex:indexPath.row];
return cell;
}

これは、indexPath オブジェクトが最初に適切に解放されないという問題でしょうか? どんな洞察も役に立ちます。貴重な時間をありがとう。

4

2 に答える 2

1

あなたの問題はUIWindowの使用にあると思います...

アプリの UIWindow インスタンスにビューを直接削除/追加しないでください。

複数のビューを表示する場合は、次のいずれかを行う必要があります。

  1. UINavigationController または UITabViewController を使用します。
  2. シングル ビュー アプリの UIView にサブビューを追加および削除します。

UIApplication は画面上のビューが誰であるかを知る必要があり、これらのパターン (つまり、viewDidLoad、viewDidDisappear など) を使用しないと、特定のデリゲート メッセージが失われる可能性があります。

自分のビューを管理しようとして、同様の問題に遭遇しました。

あなたのインスタンスでは、 UINavigationController を使用し、View Controller をプッシュおよびポップする必要があるようです。初期化、キャッシュ、および割り当て解除のすべてを管理します。これにより、問題が少なくなるはずです。

「独自のロール」を実行できるように思えるかもしれませんが、SDK と戦うことは、その慣習を使用することを学ぶことよりも難しい場合があります。

于 2009-05-14T04:54:18.223 に答える