3

次のコードがあります:

// create new delegate
MyCustomApplicationDelegate *redelegate = [[MyCustomApplicationDelegate alloc] init];
redelegate.delegate = [(NSObject<UIApplicationDelegate42> *)[UIApplication sharedApplication].delegate retain];

// replace delegate
[UIApplication sharedApplication].delegate = redelegate;

...
[UIApplication sharedApplication].delegate = redelegate.delegate;
[redelegate.delegate release];

最後の行の後、システムは基本 UIApplicationDelegate クラスの dealloc メソッドを呼び出しました。なぜ?デリゲート プロパティについて、UIApplication に関する Apple のドキュメントを読みました。

@property(nonatomic, assign) id デリゲート

ディスカッション デリゲートは、UIApplicationDelegate 正式なプロトコルを採用する必要があります。UIApplication はデリゲートを割り当て、保持しません。

UIApplication がデリゲートを割り当て、保持しないことを明確に示しています。では、なぜ私のベースデリゲートを破壊するのでしょうか?

4

3 に答える 3

6

UIApplication にはいくつかの異常な動作があります。UIApplication でデリゲート プロパティを初めて設定すると、古いデリゲートが解放されます。その後毎回、デリゲート プロパティを設定すると、古いデリゲートは解放されません。

UIApplication.h のデリゲート プロパティの宣言は次のとおりです。

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

これは、共有 UIApplication がデリゲートで保持または解放を決して呼び出さないことを意味します。これはデリゲート パターンでは正常です。保持ループが発生するため、通常、クラスはそのデリゲートを保持しません。

しかし、この場合、通常とは異なる問題があります。アプリの最初のデリゲートを所有するのは誰でしょうか? main.m の呼び出しはUIAplicationMain()、最初のデリゲートを暗黙的に割り当てて初期化します。これにより、そのデリゲートの保持カウントは 1 のままになります。誰かがそれを解放する必要がありますが、それを所有するクラスは周りにありません。これを解決するには、UIApplication に新しいデリゲートを初めて設定するたびに、最初のデリゲートを解放します。新しいデリゲートはアプリ内のクラスによって割り当てられ、初期化されているため、新しいデリゲートへの参照を既に所有しています。UIApplication は、新しいデリゲートを保持または解放しません。

于 2013-01-11T03:22:28.123 に答える
0

この後の古いデリゲートという考えがあります:

[UIApplication sharedApplication].delegate = redelegate.delegate;

リリースされます。

でもこれを見ると

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

私はそうすべきではないと考えています(割り当てのため)

私に賛成してくれますか?

于 2012-07-27T10:03:09.303 に答える
0

このように UIApplication sharedApplication デリゲートを変更することになっているとは思いません。アプリの標準デリゲートは自動的に [UIApplication sharedApplication] デリゲートになります。では、すべてのカスタム コードを通常のデリゲートに配置するだけでよいでしょうか?

于 2012-07-27T09:34:02.607 に答える