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