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]

不过,这不是一个很好的论点,因为这种开销对性能的影响可以忽略不计。

相反,我会担心使用属性的语义含义。虽然通常假设单例模式在您的应用程序的生命周期内只有一个单例类的实例,但“标准”单例接口并不能保证这一点。如果您不拥有单例类,您可能会违反其设计假设,因为它会在具有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 回答