-5

这是我单身的代码

+ (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.

我希望我的问题很清楚

4

2 回答 2

1

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

于 2013-07-17T13:31:45.773 回答
0

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

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

然后打电话

[self.sharedStore decide:YES];
于 2013-07-17T17:13:42.017 回答