欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS创建单例

程序员文章站 2022-07-13 23:37:46
...

在开发过程中经常会遇到需要单例的时候,然后很多时候大家写的单例其实并不符合要求。下面介绍一个标准的单例。

一般来说,我还是喜欢用GCD来创建单例,使用dispatch_once很方便。

static id _instance;   
 
+ (instancetype)sharedInstance  
{   
    static dispatch_once_t onceToken;   
    dispatch_once(&onceToken, ^{   
        _instance = [[self alloc] init];   
    });   
    return _instance;   
} 

复制代码

上面说的并不符合要求就是这样创建出来的单例。很多人以为这样就可以了,dispatch_once保证了只运行一次。然而,如果一个不知情的人调用了你写的类,你无法保证他不去调用alloccopy来生成实例。 所以我们还要做一些其他的处理。

+ (instancetype)allocWithZone:(struct _NSZone *)zone  
{   
    static dispatch_once_t onceToken;   
    dispatch_once(&onceToken, ^{   
        _instance = [super allocWithZone:zone];   
    });   
    return _instance;   
}   
 
- (id)copyWithZone:(NSZone *)zone   
{   
    return _instance;   
}  
 
- (id)mutableCopyWithZone:(NSZone *)zone {   
    return _instance;   
}
复制代码

这样就可以了。

原文链接