iOS 单列的创建和销毁

来源:互联网 发布:医疗软件项目 编辑:程序博客网 时间:2024/05/21 06:16

对于某些需求可能需要销毁单列:开始打算遍历单列的所有属性,重置为nil,那样似乎不太好。


先看下单列的创建:

static SMMapModelManager _mapModelManager;方法一:+(id)shareInstance{    @synchronized(self){        if(_mapModelManager == nil)            _mapModelManager = [SMMapModelManager alloc] init];    }    return _mapModelManager;}方法二:+(id)shareInstance{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        if(_mapModelManager == nil)            _mapModelManager = [SMMapModelManager alloc] init];    });    return _mapModelManager;}以上两种方法都是线程安全的.不过苹果官方现在提倡方法二.//重写allocWithZone,里面实现跟方法一,方法二一致就行.+(id)allocWithZone:(struct _NSZone *)zone{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        if(_mapModelManager == nil)            _mapModelManager = [SMMapModelManager alloc] init];    });    return _mapModelManager;}//保证copy时相同-(id)copyWithZone:(NSZone *)zone{    return _mapModelManager;}这样就是一个完整的单例,保证怎么创建都是唯一的.MRC下的创建 创建过程跟ARC下步骤一样.不过要处理一些内存管理的函数.//不需要计数器+1- (id)retain {    return self;}//不需要. 堆区的对象才需要- (id)autorelease {    return self;}//不需要- (oneway void)release {}//不需要计数器个数. 直接返回最大无符号整数- (NSUInteger)retainCount {    return UINT_MAX;  //参照常量区字符串的retainCount}




单列的销毁:


方法一:+(void)attemptDealloc{    [_mapModelManager release]; //mrc 需要释放,当然你就不能重写release的方法了.    _mapModelManager = nil;}方法二:1. 必须把static dispatch_once_t onceToken; 这个拿到函数体外,成为全局的.2.+(void)attempDealloc{    onceToken = 0; // 只有置成0,GCD才会认为它从未执行过.它默认为0.这样才能保证下次再次调用shareInstance的时候,再次创建对象.//    [_mapModelManager release];    _mapModelManager = nil;}



0 0
原创粉丝点击