4

appDelegate多くのビュー コントローラーにプロパティを持つコードを監査しています。

@property (nonatomic, unsafe_unretained) TheAppDelegate *appDelegate;

このような結合の設計上の意味は別として、便利さ以外に、アプリのデリゲートを取得することと比較して、プロパティの利点はありますか。appDelegate

TheAppDelegate *appDelegate = (TheAppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate someMethod];
4

5 に答える 5

3

私も時々これを行います。シングルトン アクセス メソッドを使用してフェッチできる依存関係のプロパティを宣言します。

@class Foo : NSObject
@property(strong) NSNotificationCenter *notificationCenter;
@end

@implementation Foo

- (id) init
{
    self = [super init];
    [self setNotificationCenter:[NSNotificationCenter defaultCenter]];
    return self;
}

@end

利点は、依存関係の結合が緩くなることです。たとえば、独自の模擬インスタンスを簡単に提供できます。場合によっては、_notificationCenter代わりに[NSNotificationCenter defaultCenter].

考えられる 3 つ目の理由は、プロパティを宣言すると依存関係が明示的になるためです。パブリック API を見ると、オブジェクトの状態または動作がアプリ デリゲートに依存していることがわかります。クラス実装でシングルトンを使用すると、この事実が完全に隠されます。

ただし、アプリ デリゲートに依存するアプリ内のコントローラーが多数ある場合は、おそらく単なる設計上の欠陥です。

于 2013-04-23T19:13:28.290 に答える
2

組み立てられたように質問に答えます。

具体的な利点は次のとおりです。

よりクリーンなコード - プロパティは 1 回設定されます (読み取り専用になる可能性があります)。複数回ご利用の場合

self.appDelegate は、毎回共有アプリケーションから appDelegate を取得するよりも簡単です。(そしてシンプルなほど良い)

わずかな効率上の利点があるかもしれません (ただし、これは時期尚早の最適化であり、コンパイラによっては存在しない場合もあります)。

CodaFi には少し臭いという点で同意せざるを得ないので、複雑さを隠すために構文糖衣を作成するという妥協点があります。

@class MyAppDelegate;
@interface MySharedAppDelegate : NSObject 

+ (MyAppDelegate*) appDelegate;
@end

#include "MyAppDelegate.h"
@implementation MySharedAppDelegate

+ ( MyAppDelegate*) appDelegate {
    return (MyAppDelegate*)[UIApplication sharedApplication].appDelegate;
}
@end
于 2013-04-23T19:30:43.480 に答える
1

これは決して主観的なものではないと思います。質問は:

appDelegate プロパティとアプリ デリゲートの取得の利便性以外に利点はありますか

そして答えは「いいえ」だと思います。便利以外のメリットはありません。

理想的には、アプリ デリゲートとビュー コントローラーの間に結合がない (または最小限である) ため、どちらの方法を使用するかはあまり重要ではありません。私が現在取り組んでいるプロジェクトでは、必要なときにデリゲートを取得しているだけです (コードベース全体で 2 か所しかありません)。何十もの場所でこれを行っている場合は、プロパティとして持つ方が理にかなっているかもしれませんが、これも純粋に便宜上のものです。

于 2013-04-23T21:19:19.813 に答える
1

私はこれをするのが好きです:

//in .pch file
#import "Includes.h"

//in Includes.h
#import "AppDelegate.h"
#define APPDELEGATE() (AppDelegate *)[[UIApplication sharedApplication]delegate]

次に、appDelegateに何かを尋ねる必要がある場所ならどこでも、私が言うだけです

[APPDELEGATE() someMethod];

AppDelegate のプロパティを別の場所に置くことは、悪い考えのように思えます。その参照(sharedApplication)を取得する簡単な方法がすでにあることを除いて、理由は言えません。

この場合、おそらく開発者の便宜のためです。ただし、どこでも AppDelegate への参照が「必要」であることは、おそらくスパゲッティ コードと不適切なカプセル化の指標であると言わざるを得ません。

*ちなみに、appDelegate 内にいくつかの「グローバル」変数への参照を保存しています。これは、カプセル化が不適切であることを示している可能性もあります...これが、最初に APPDELEGATE() 宣言を使用する理由です ;-)

**NSDateFormatter のような、非常に頻繁に必要になるが、必ずしもクラス内に「存在する」とは限らないもの (すべてのインスタンスに 1 つ必要ではありませんが、複数のインスタンスに適用できます)、または特定の状態への参照、 「グローバル アプリケーションのフォント サイズ」など

于 2013-04-23T20:32:07.833 に答える
1

次のようなすべてのビューコントローラーでプロパティを定義するよりも、マクロを使用することを好みます

#define appDelegate ((MYAppDelegate *)[[UIApplication sharedApplication] delegate])

これをconstants.hで定義し、ヘッダーを.pchファイルに含めるとappDelegate 、コード内の任意のクラスでこれを使用できます。

于 2013-04-23T19:47:43.310 に答える