2012-02-10 14 views
10

UIViewControllerのインスタンス変数としてAppDelegateを使用しても構いませんか?iOS - AppDelegateをインスタンス変数として使用しますか?

AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate]; 

[appDelegate doSomething]; 

を私が行うことができます::のような@property (nonatomic, weak) AppDelegate *appDelegate;

私が求めているのはなぜ、私はかなり頻繁にアクセスする必要があるので、代わりにやっているためである

[appDelegate doSomething]

+2

頻繁にアクセスしている場合は、その作業を他の場所に移動しないでください。 – Osiris

答えて

12

それとものUIViewControllerのサブクラスでは

-(YourAppDelegate*) app 
{ 
    return (YourAppDelegate*) [[UIApplication sharedApplication] delegate]; 
} 

を行うことができます - そして、あなたのビューコントローラのすべてのベース・クラスのことをします。

次に、[self app]が機能し、参照を保持する必要はありません。

一般的なシンプルなユーティリティを保つためにこれを行います。これはカテゴリでも行うことができます。

4

アクセスの区別完全表現によるデリゲートと(非原子的、弱い)プロパティのデリゲートは任意です。確かに、それを頻繁に呼び出す場合は、プロパティを定義してコード行を保存してください。

この問題は、カプセル化の問題の可能性がより大きくなる問題を提起します。ベストプラクティスでは、コールが階層構造を下回っていることを示しています。もちろん、アプリケーションデリゲートはちょっとした特殊ケースですが、私のアドバイスは、アプリケーションデリゲートから必要なリソースを切り離す方法を検討し、これらの参照をビューコントローラの階層に渡すことです作成した。

16

多分それは大丈夫かもしれません。

しかし私の好きな解決策は次のとおりです。あなたが好きな場所あなたのAppDelegate.m

+ (AppDelegate *)appDelegate 
{ 
    return (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
} 

であなたのAppDelegate.h

+ (AppDelegate *)appDelegate; 

は、次に使用:

AppDelegate* sharedDelegate = [AppDelegate appDelegate]; 

いくつかの注意:

AppDelegateを共有データに使用する場合は、singletons-appdelegates-and-top-level.htmlを読むことができます。

あなたの論理的なアプリケーションのワークフローのAppDelegateを使用する場合はhandling-your-initial-view-controllers-for-iphone/

を読むことができるが、それがお役に立てば幸いです。

+0

'getAppDelegate'はAppleの[命名ガイドライン]に違反しています(http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html#//apple_ref/doc/uid/20001282- BCIGIJJF)。より良い名前は '+(AppDelegate *)appDelegate;'または '+(AppDelegate *)sharedAppDelegate;' –

+0

@AlexPretzlavあなたの編集に感謝します。 –