【问题标题】:Objective-C - iOS - Singleton explanation [closed]Objective-C - iOS - 单例解释[关闭]
【发布时间】:2013-07-16 01:50:01
【问题描述】:

这是我单身的代码

+ (ALData *)sharedInstance {

    static ALData *_shared;
    if(!_shared) {
        static dispatch_once_t oncePredicate;
        dispatch_once(&oncePredicate, ^ {
            _shared = [[super allocWithZone:nil] init];
        });
    }

    return _shared;
}

+ (id)allocWithZone:(NSZone *)zone { return [self sharedInstance]; }
- (id)copyWithZone:(NSZone *)zone { return self; }
#if (!__has_feature(objc_arc))
- (id)retain { return self; }
- (unsigned)retainCount { return UINT_MAX; }
- (void)release {}
- (id)autorelease { return self; }
#endif

现在,我见过的所有单身人士都以这种方式调用:

[[SINGLETON sharedInstance] instanceMethod];

但我想这样打电话:

[SINGLETON classMethod];

要在创建方法时执行此操作,我会这样做:

+ (BOOL)decide:(BOOL)var {
    [self sharedInstance];
    if (var)
        return NO;
    else
        return YES;
}

相反,如果我想以第一种方式继续,我必须以这种方式声明我的方法:

- (BOOL)decide:(BOOL)var {
    if (var)
        return NO;
    else
        return YES;
}

当我调用它时,我必须写:

[[SINGLETON sharedInstance] decide:YES];

我的问题是:这两种方法有什么区别?无论是在性能方面,还是在设计模式层面。 我想知道这一点,因为我认为在美学上更好的方法是第二种方法,即不称为sharedInstance 的方法。

希望我的问题很清楚

【问题讨论】:

  • 你的两个例子之间没有关系。第一个调用 Class 方法(不需要第一行,为什么要写那个?),另一个调用单例实例上的实例方法
  • 糟糕的例子。您的 +decide: 方法获取共享实例,不会将其分配给任何东西,并且无论如何都不需要该实例。您的 -decide: 方法也可能是一个类方法,因为它根本不依赖于对象的状态。请发布真实代码而不是虚假示例。
  • @MidhunMP 我不认为这很糟糕,为什么会很糟糕?而且,为什么这两个例子之间没有关系?一个是类方法,一个是实例方法,一个需要在sharedInstance之后调用,另一个可以作为类方法调用,因为调用sharedInstance本身。
  • @AndreaLufino:你为什么在类方法中调用[self sharedInstance];

标签: ios objective-c design-patterns singleton


【解决方案1】:

创建一个返回共享实例的属性,然后调用它。

-(YourSingleton *)sharedStore
{
    return [Singleton sharedInstance];
}

然后调用

[self.sharedStore decide:YES];

【讨论】:

    【解决方案2】:

    Singleton 和具有一堆 Class 方法的 Class 之间的主要区别在于 Singleton 可以保留某种状态。例如,一组数据或一些布尔标志。通过调用sharedInstance,您可以访问该类的唯一一个实例,它保持活动状态(并且数据的状态保存在那里)。你当然可以在你的单例类中添加一些类方法,它们会起作用,但你会避开Singleton 模式。

    【讨论】:

    • 那么,需要调用sharedInstance的方式才是真正的单例模式,对吧?另一个是带有类方法的“简单”类,对吧?
    • @AndreaLufino 是的。在第一种情况下,您在保留某些状态的单例对象上调用实例方法。在第二种情况下,您正在调用一个 Class 方法。
    • 好,现在这很清楚了。但还有一个问题。如果第二种情况是一个带有类方法的类,我是否需要在上面写sharedInstance方法并在每个类方法中调用它?
    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2011-11-04
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多