您的当前位置:首页正文

iOS创建单例

2024-11-26 来源:个人技术集锦

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

一般来说,我还是喜欢用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;   
}
复制代码

这样就可以了。

显示全文