1

問題: UIWindow のサブビューとしての UINavigationController、rootViewController クラス、およびカスタム MyViewController クラスがあります。次の手順では、100% 再現可能な Exc_Bad_Access が取得されます。

[myNaviationController pushViewController:myViewController_1stInstance animated:YES];
[myNaviationController pushViewController:myViewController_2ndInstance animated:YES];

左後ろの tapBarItem を 2 回押して (myViewController インスタンスを 2 つポップアウト)、rootViewController を表示します。

試行錯誤の苦痛な半日の後、私は最終的に答えを見つけますが、質問もします。

解決策: .h ファイルが煩雑になるのを避けるために、プライベート変数を宣言する怠惰な方法として、.m ファイルで多くのオブジェクトを宣言しました。例えば、

#impoart "MyViewController.h"
NSMutableString*variable1;

@implement ...

-(id)init
{
   ...
   varialbe1=[[NSMutableString alloc] init];
   ...
}

-(void)dealloc
{
   [variable1 release];
}

何らかの理由で、myViewController_2ndInstance のビューをロードした後、myViewController_1stInstance のビューがアンロードされる (ただしナビゲーション コントローラのスタック内にある) 場合、iPhone OS はこれらの「遅延プライベート」変数のメモリ割り当てを追跡できなくなる場合があります。myViewController_2ndInstance'view がまだロードされているため、最初に背面の tapBarItem をタップしても問題ありません。しかし、最初のインスタンスの割り当てを解除しようとしたため、背面の tapBarItem を 2 回タップすると地獄に落ちました。[可変解放] を呼び出したところ、ランダムにポイントされた (ルース ポインター) ため、Exc_Bad_Access になりました。

この問題を解決するには、変数 1 を .h ファイルで @private として宣言するだけです。

ここに私の質問があります: UINavigationController に関与するまで、私はかなり長い間「怠惰なプライベート」変数を問題なく使用してきました。これはiPhone OSのバグですか?それとも、Objective C についての根本的な誤解がありますか?

4

2 に答える 2

3

同じ静的に割り当てられた変数を使用して、View Controller の両方のインスタンスに関連している可能性があります。

つまり、 と の両方myViewController_1stInstanceがメモリ内myViewController_2ndInstanceの同じvariable1場所を使用し、互いに上書きしています。

定義後に中括弧内で宣言された変数に@interfaceは、クラスのインスタンスごとに ( を呼び出すたびに) ランタイムによってメモリ ロケーションが割り当てられます[<ClassName> alloc]。グローバル スコープ (つまり、関数またはクラス宣言の外側) で宣言された変数は、 that: global. つまり、変数はアプリケーションの実行中のコピーごとに 1 つの値しか保持できないということです。

Objective-C には完全にプライベートな変数はありませんが、ここで説明されているように、コンパイル時に他のインスタンスから隠すことができます。

于 2010-05-11T00:22:13.763 に答える
1

少し遅い反応ですが、この問題は以前に見たことがあります。viewControllers2 つのアニメーションを同時にプッシュしないでください。最初のものをアニメーションなしで押し、2 つ目をアニメーション付きで押します。UINavigationController2 つのアニメーションを同時に処理することはできません。

于 2012-02-14T06:38:38.320 に答える