+(id)allocWithZone:(NSZone * )zone //重写父类的alloc方法
{
//懒汉式:
// if (_instance==nil) {
// @synchronized(self){ //加锁
// if(_instance==nil){
// _instance=[[self alloc]init];
// }
// }
// }
//GCD模式
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{
_instance=[[super allocWithZone:zone];
});
return _instance;
}
+(instancetype)sharedDatatool //判断_instance属性是否为空,若为空,则加线程锁, //防止其他线程同时访问,再次判断_instance是 // 否为空,若为空,则为其分配内存空间
{
//懒汉式:
// if(_instance==nil){
// @synchronized (self){
// if(_instance==nil){
// _instance=[[[self alloc]init];
// }
// }
// }
//GCD模式
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{
_instance=[[self alloc]init];
});
return _instance;
}
-(id)copyWithZone:(NSZone *)zone //重写父类的copy方法,使该方法 //直接返回属性值,不再对属性做 //处理,防止外部利用copy方法实 //现对_instance的篡改
{
return _instance;
} |
|