美文网首页
单例的几种方式

单例的几种方式

作者: CaesarsTesla | 来源:发表于2017-03-27 11:32 被阅读8次

    1、GCD

    static TXPerson *_person;
    
    + (instancetype)allocWithZone:(struct _NSZone *)zone
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _person = [super allocWithZone:zone];
        });
        return _person;
    }
    
    + (instancetype)sharedPerson
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _person = [[self alloc] init];
        });
        return _person;
    }
    
    - (id)copyWithZone:(NSZone *)zone
    {
        return _person;
    }
    

    2、非GCD

    static id _instance;
    
    + (instancetype)allocWithZone:(struct _NSZone *)zone
    {
        @synchronized(self) {
            if (_instance == nil) {
                _instance = [super allocWithZone:zone];
            }
        }
        return _instance;
    }
    
    + (instancetype)sharedInstance
    {
        @synchronized(self) {
            if (_instance == nil) {
                _instance = [[self alloc] init];
            }
        }
        return _instance;
    }
    
    - (id)copyWithZone:(NSZone *)zone
    {
        return _instance;
    }
    

    3、宏-1

    // .h文件
    #define TXXMGSingletonH + (instancetype)sharedInstance;
    
    // .m文件
    #define SingletonM \
    static id _instace; \
     \
    + (instancetype)allocWithZone:(struct _NSZone *)zone \
    { \
        static dispatch_once_t onceToken; \
        dispatch_once(&onceToken, ^{ \
            _instace = [super allocWithZone:zone]; \
        }); \
        return _instace; \
    } \
     \
    + (instancetype)sharedInstance \
    { \
        static dispatch_once_t onceToken; \
        dispatch_once(&onceToken, ^{ \
            _instace = [[self alloc] init]; \
        }); \
        return _instace; \
    } \
     \
    - (id)copyWithZone:(NSZone *)zone \
    { \
        return _instace; \
    }
    

    4、宏-2

    // .h文件
    #define TXSingletonH(name) + (instancetype)shared##name;
    
    // .m文件
    #define SingletonM(name) \
    static id _instance; \
     \
    + (instancetype)allocWithZone:(struct _NSZone *)zone \
    { \
        static dispatch_once_t onceToken; \
        dispatch_once(&onceToken, ^{ \
            _instance = [super allocWithZone:zone]; \
        }); \
        return _instance; \
    } \
     \
    + (instancetype)shared##name \
    { \
        static dispatch_once_t onceToken; \
        dispatch_once(&onceToken, ^{ \
            _instance = [[self alloc] init]; \
        }); \
        return _instance; \
    } \
     \
    - (id)copyWithZone:(NSZone *)zone \
    { \
        return _instance; \
    }
    
    在使用的时候
    TXSingletonH(Person)
    TXSingletonM(Person)
    就是说把Person接在了后边。
    

    注意宏中#的使用
    ##表示连接
    @#mudy,表示@"mudy",即将紧跟在后边的标识符加上字符串

    相关文章

      网友评论

          本文标题:单例的几种方式

          本文链接:https://www.haomeiwen.com/subject/lozlottx.html