美文网首页
严格的单例创建

严格的单例创建

作者: Leon1024 | 来源:发表于2020-03-15 16:18 被阅读0次
    Singleton.h
    @interface Singleton : NSObject
    @property(nonatomic,strong) NSString *name;
    +(Singleton*)defaultManager;
    @end
    
    
    Singleton.m
    @implementation Singleton
    //单例类的静态实例对象,因对象需要唯一性,故只能是static类型
    static Singleton *defaultManager = nil;
    
    /**单例模式对外的唯一接口,用到的dispatch_once函数在一个应用程序内只会执行一次,且dispatch_once能确保线程安全
    */
    +(Singleton*)defaultManager
    {
        static dispatch_once_t token;
        dispatch_once(&token, ^{
            if(defaultManager == nil)
            {
                defaultManager = [[self alloc] init];
            }
        });
        return defaultManager;
    }
    
    /**覆盖该方法主要确保当用户通过[[Singleton alloc] init]创建对象时对象的唯一性,alloc方法会调用该方法,只不过zone参数默认为nil,因该类覆盖了allocWithZone方法,所以只能通过其父类分配内存,即[super allocWithZone:zone]
     */
    +(id)allocWithZone:(struct _NSZone *)zone
    {
       static dispatch_once_t token;
        dispatch_once(&token, ^{
            if(defaultManager == nil)
            {
                defaultManager = [super allocWithZone:zone];
            }
        });
        return defaultManager;
    }
    
    
    //  如果需要自定义初始化属性,可在这里实现
    - (instancetype)init
    {
        self = [super init];
        if(self)
        {
            self.name = @"Singleton";
        }
        return self;
    }
    
    
    //覆盖该方法主要确保当用户通过copy方法产生对象时对象的唯一性
    - (id)copy
    {
        return self;
    }
    
    //覆盖该方法主要确保当用户通过mutableCopy方法产生对象时对象的唯一性
    - (id)mutableCopy
    {
        return self;
    }
    //自定义描述信息,用于log详细打印
    - (NSString *)description
    {
        return [NSString stringWithFormat:@"memeory address:%p,property name:%@",self,self.name];
    }
    

    相关文章

      网友评论

          本文标题:严格的单例创建

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