iOS 单列的创建和销毁

对于某些需求可能需要销毁单列:开始打算遍历单列的所有属性,重置为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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值