0

Objective-Cで使用しているため、これを求めていますが、他のすべての言語に適用される可能性があります。

-Obj-C プロパティへの単一の参照を持つことは悪いことですか?

-すべてのメソッドで共有インスタンスを呼び出した方がよいでしょうか?

より正確:私は使用して呼び出すことができるシングルトンクラスを持っています[MySingleton sharedInstance];

別のクラスでそのシングルトンの値が 50 回必要なMySecondClassので、Obj-C プロパティを作成しました

@property (nonatomic, strong) MySingleton *mySingletonProperty;

MySecondClass呼び出して、そのプロパティを一度遅延して初期化します

if(!self.mySingletonProperty)
{
    self.mySingletonProperty = [MySingleton sharedInstance];
}

私の友人は、これは悪い考えであり、シングルトンを使用してプロパティをインスタンス化しない方がよいと私に言いました。[MySingleton sharedInstance];正しい方法は、すべてのメソッドを呼び出しMySecondClassてローカル変数に割り当てることです。

あれは正しいですか?なぜ?スレッドの安全性は問題ではありません。

(ここで一般的にシングルトンを使用するのが悪い考えであるかどうかについて議論しないでください - ありがとう:-)

4

2 に答える 2

3

呼び出しを繰り返すことに対して私がよく目にする議論[SingletonClass sharedSingleton]は、メッセージ パッシング (関数呼び出し) のオーバーヘッドです。その場合、シングルトンへの参照をプロパティに隠しておくと、同じ問題が発生します。self.singleton常に呼び出すと、 を呼び出すのと同じ数の関数呼び出しになります[SingletonClass sharedSingleton]

ただし、このようなオーバーヘッドがパフォーマンスに与える影響はごくわずかであるため、これは大きな議論ではありません。

代わりに、プロパティを使用することのセマンティックな影響について心配します。通常、シングルトン パターンでは、アプリの有効期間中にシングルトン クラスのインスタンスが 1 つだけ存在することが前提となりますが、「標準」シングルトン インターフェースについてはそれを保証するものは何もありません。シングルトン クラスを所有していない場合は、strongプロパティを持つ他のオブジェクトの有効期間にわたってそれを保持することで、その設計上の前提に違反する可能性があります。そのクラスを所有している場合、そのクラスへの強力な参照を維持すると、設計上の制約が追加され、後で問題が発生する可能性があります (可能性は低いですが)。

要約すると、私は次のアドバイスをします。次のようなコードがある場合:

- someMethod {
    [[SingletonClass sharedSingleton] doSomething];
}
- someOtherMethod {
    [[SingletonClass sharedSingleton] doSomethingElse];
}

何も問題はありません。(入力の手間を本当に省きたい場合は、ローカル プリプロセッサ マクロが適して[SingletonClass sharedSingleton]いるかもしれません。)

次のようなコードがある場合:

- someMethod {
    [[SingletonClass sharedSingleton] doSomething];
    [[SingletonClass sharedSingleton] doSomethingElse];
    [[SingletonClass sharedSingleton] doSomeOtherThing];
    [[SingletonClass sharedSingleton] doYetAnotherThing];
}

次に、ローカル変数にスタッシュすることで、セマンティックを変更することなく、少しの入力 (および些細なパフォーマンス コスト) を節約できます。

- someMethod {
    SingletonClass *singleton = [SingletonClass sharedSingleton];
    [singleton doSomething];
    [singleton doSomethingElse];
    [singleton doSomeOtherThing];
    [singleton doYetAnotherThing];
}
于 2013-09-23T18:02:31.450 に答える
-2

それでもシングルトンが必要な場合は、それへの参照を保持しても問題はありません。しかし、なぜ参照をプロパティとして保持するのでしょうか? 私のアドバイスは、内部変数を作成することです:

@interface MySecondClass : NSObject {
    // ...
    MySingleton *mySingletonInstanse;
}
// ...
@end
于 2013-09-23T18:21:44.160 に答える