0

アプリで次のコードを何度も使用しています (特に、NavigationController を管理するために):

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 

いつリリースすればいいですか?

助けてくれてthx、

ステファン

4

2 に答える 2

7

しないでください。アプリケーション デリゲートを解放しないでください。OS によって自動的に管理されます。

アプリの main.m ファイルを見ると、アプリUIApplicationを表す のインスタンスを初期化するコードがいくつかあることがわかります。アプリケーション デリゲートのライフサイクルを管理するのはアプリの責任であり、ユーザーの責任ではありません。

@Gozが指摘するように編集してください。releaseある時点でそれを行う必要がありますretain。ただし、アプリケーション オブジェクト (ひいてはそのデリゲート) は、アプリケーションの存続期間中はスコープ内にとどまることが保証されているため (いじり回さない限り)、デリゲートでメモリ管理をまったく行わない方がはるかに優れています。これにより、偶発的な過剰リリースやその他の関連する問題の可能性が回避されます。

于 2011-09-10T08:31:24.930 に答える
0

簡単な答え: アプリケーション デリゲートを決して解放しないでください。

説明:
物事がどのように宣言されているかを確認するときに、mem-mgmt の問題に対処する方法に役立つことがよくあります。プロパティがどのようdelegateに宣言されているか見てみましょうUIApplication:

@property(nonatomic,assign) id<UIApplicationDelegate> delegate;

ご覧のとおり、これは割り当てられたプロパティです。つまり、ここで行われるすべての mem-mgmt はインスタンス変数へのポインタの割り当てです。releaseこれは、アプリケーション デリゲートを呼び出すと、-deallocに対してメソッドが実行されることを意味しますMyAppDelegate。これをデバッガで試してみると、アプリケーションが EXC_BAD_ACCESS を受け取ることがわかります。つまり、クラッシュします。

編集:ただし、Goz が示唆するように、電話retainしてからrelease. しかし、そもそもretain/releaseアプリ デリゲートでこのようなことを行うのは意味がありません。

于 2011-09-10T11:41:10.767 に答える