問題: 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 についての根本的な誤解がありますか?