单例的创建需要注意的一些问题: 1.先定义一个静态的instance ,static MyClass _instance; 2.重写allocWithZone方法,此方法为对象分配空间必须调用方法; 3.定义一个share的类方法,能够被全局调用,并且方法内需要考虑线程安全 4.如果需要copy,需要遵守NSCopying协议,以及在copyWithZone中直接返回当前对象
声明静态instance
static MyClass _instance;
创建单例
**方法1**
+ (id)shareInstance {
@synchronized(self) {//同步锁
if (_instance == nil) {
_instance = [[MyClass alloc] init];
}
}
return _instance;
}
**销毁方法:**
+ (void)attemptDealloc {
_instance = nil;
}
**方法2**
static dispath_once_t onceToken;
+ (id)shareInstance {
dispatch_once(&onceToken, ^ {
if (_instance == nil) {
_instance = [[MyClass alloc] init];
}
});
return _instance;
}
**销毁方法:**
+ (void)attemptDealloc {
onceToken = 0;//只有置为0,GCD才会认为它从来未执行过,这样才能保证下次再次调用instance的时候,创建新的对象
_instance = nil;
}
重写allocWithZone
//重写allocWithZone,里面实现跟方法一,方法二一致就行
+(id)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if(_instance == nil)
_instance = [MyClass alloc] init];
});
return _instance;
}