アプリで次のコードを何度も使用しています (特に、NavigationController を管理するために):
MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
いつリリースすればいいですか?
助けてくれてthx、
ステファン
アプリで次のコードを何度も使用しています (特に、NavigationController を管理するために):
MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
いつリリースすればいいですか?
助けてくれてthx、
ステファン
しないでください。アプリケーション デリゲートを解放しないでください。OS によって自動的に管理されます。
アプリの main.m ファイルを見ると、アプリUIApplication
を表す のインスタンスを初期化するコードがいくつかあることがわかります。アプリケーション デリゲートのライフサイクルを管理するのはアプリの責任であり、ユーザーの責任ではありません。
@Gozが指摘するように編集してください。release
ある時点でそれを行う必要がありますretain
。ただし、アプリケーション オブジェクト (ひいてはそのデリゲート) は、アプリケーションの存続期間中はスコープ内にとどまることが保証されているため (いじり回さない限り)、デリゲートでメモリ管理をまったく行わない方がはるかに優れています。これにより、偶発的な過剰リリースやその他の関連する問題の可能性が回避されます。
簡単な答え: アプリケーション デリゲートを決して解放しないでください。
説明:
物事がどのように宣言されているかを確認するときに、mem-mgmt の問題に対処する方法に役立つことがよくあります。プロパティがどのようdelegate
に宣言されているか見てみましょうUIApplication
:
@property(nonatomic,assign) id<UIApplicationDelegate> delegate;
ご覧のとおり、これは割り当てられたプロパティです。つまり、ここで行われるすべての mem-mgmt はインスタンス変数へのポインタの割り当てです。release
これは、アプリケーション デリゲートを呼び出すと、-dealloc
に対してメソッドが実行されることを意味しますMyAppDelegate
。これをデバッガで試してみると、アプリケーションが EXC_BAD_ACCESS を受け取ることがわかります。つまり、クラッシュします。
編集:ただし、Goz が示唆するように、電話retain
してからrelease
. しかし、そもそもretain/release
アプリ デリゲートでこのようなことを行うのは意味がありません。