我应该在哪里声明静态实例?

时间:2014-09-14 16:07:15

标签: ios objective-c singleton

这些单例实现之间有什么区别:

  1. 在sharedManager函数之外声明静态实例

    @implementation MyManager
    
    static MyManager * manager = nil;
    
    +(instancetype)sharedManager
    {
        @synchronized(self) {
            if(manager==nil){
                manager = [[MyManager alloc]init];
            }
            return manager;
        }
    }
    

    2

    在sharedManager函数中声明静态实例

    @implementation MyManager
    
             +(instancetype)sharedManager
                {
                    static MyManager * manager = nil;
                    @synchronized(self) {
                        if(manager==nil){
                            manager = [[MyManager alloc]init];
                        }
                        return manager;
    
    
       }
            }
    @end
    
    1. 在界面中将MyManager声明为extern
  2. 4

    + (instancetype)sharedManager {
        static MyManager *singleton=nil;
        static dispatch_once_t once;
        dispatch_once(&once, ^{
            singleton = [[self alloc] init];
        });
        return singleton;
    }
    

1 个答案:

答案 0 :(得分:2)

你应该在accessor方法中使它成为一个静态变量。这可以防止您在正确初始化之前意外访问它。

安全地初始化单身人士的现代方法是这样的:

+ (instancetype)sharedManager {
    static MyManager *singleton;
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        singleton = [[self alloc] init];
    });
    return singleton;
}
如果已经执行了一次块,则

dispatch_once明显快于@synchronized