0

既存のシングルトン クラスのラッパー クラスを作成しています。シングルトンに何度かアクセスするので、ivar としてラッパー クラスに格納したいと思います...

@interface WrapperClass () 

@property (nonatomic, strong) SingletonClass singletonObj;

@end

...だから私は常に書く必要はありません[[SingletonClass sharedInstance] methodName]。代わりに、私は書くことができます[singletonObj methodName]。それは私にとってよりきれいに感じます。

私は iOS 開発に不慣れなので、このアプローチに根本的な問題があるかどうか疑問に思っています。

また、ARC では、強い参照を使用してシングルトンを保存する必要がありますか?

4

3 に答える 3

2

あなたが何かおかしなことをしているのでない限り、余分な保持/解放は問題を引き起こさないはずです。

したがって、ivarに保存することに実際の問題はありません...

これを行うより良い理由は、入力を保存することではなく、クラスのテスト可能性/再利用性を向上させることです。これをivarにすることで、動作を変更するために別のクラスを挿入できます。

デフォルトでシングルトンを提供するアクセサーを作成することを検討しますが、このように選択した場合は、別のクラスを注入できます。

- (SingletonClass *)singletonObj;
{
  return _singletonObj = _singletonObj ?: [SingletonClass sharedInstance];
}

アップデート:

また、「このシングルトンを使用することと、ivarを使用することをなぜ異なるものにするのか」についても検討する価値があります。ivarのようにクラス全体で使用する場合、なぜまったく異なる方法でアクセスするのですか?

たとえば、私が使用する場合、managedObjectContextアプリ全体に1つしかないことがよくあります。多くの人がアプリデリゲートをシングルトンとして使用し、その方法でアクセスしますが、私はそれをivarとして渡すことを好みます。概念的にmanagedObjectContextは、これは他のivarと同じように使用している別のオブジェクトですが、アクセス方法を精神的に切り替える必要があるのはなぜですか?

これは悪いです

[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

良い

self.managedObjectContext;

これにより、2つの利点が得られます。

  1. 私のクラスにへの呼び出しが散らばっている場合、[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];このプロジェクトからそれを取り除いて、危険な検索と置換なしに別のプロジェクトに配置することは困難です。「アクセサー」の1つの場所でシングルトンにアクセスする場合、コードを変更する場所は1つだけです。

  2. 私の本番アプリでは、データを永続的にしたいのでmanagedObjectContext、永続ストアを使用してオブジェクトにアクセスできるようにしますが、テストでは、テスト間で状態を永続化したくないので、オブジェクトを非永続にします代わりに保存してください。

于 2012-12-09T23:48:04.273 に答える
1

それは理にかなっている。シングルトンを初期化して、ivarに保存するだけです。そうは言っても、あなたのコードは実際にはプロパティを定義していますが、これはivarと同じものではありません。

たとえば、次のようにシングルトンi変数を定義できます。

@implementation WrapperClass {
    SingletonClass * _singleton;
}

次に、デフォルトのコンストラクターでシングルトンを初期化します

- (id)init {
    self = [super init];
    if (self) {
        //...
        _singleton = [SingletonClass sharedInstance];
        //...
    }
    return self;
}
于 2012-12-09T23:31:55.973 に答える
0

次のように、マクロを定義するだけです。

#define _SINGLETON(method) { [[SingletonClass sharedManager] method]; }

次に、次のようにコードで使用できます。

_SINGLETON(methodName);

このマクロはSingletonClass.hで定義できます。そうすれば、ヘッダーがインポートされる場所ならどこでも使用できるようになります。このように、iVarについて考える必要はありません。

于 2012-12-10T10:04:27.957 に答える