staticMyGizmoClass*sharedGizmoManager=nil;+(MyGizmoClass*)sharedManager{@synchronized(self){if(sharedGizmoManager==nil){[[selfalloc]init];// assignment not done here}}returnsharedGizmoManager;}+(id)allocWithZone:(NSZone*)zone{@synchronized(self){if(sharedGizmoManager==nil){sharedGizmoManager=[superallocWithZone:zone];returnsharedGizmoManager;// assignment and return on first allocation}}returnnil;//on subsequent allocation attempts return nil}-(id)copyWithZone:(NSZone*)zone{returnself;}-(id)retain{returnself;}-(unsigned)retainCount{returnUINT_MAX;//denotes an object that cannot be released}-(void)release{//do nothing}-(id)autorelease{returnself;}
instance为将被实例化的对象,为了让instance只被实例化一次,用到了GCD(Grand Central Dispatch)中的dispatch_once方法。该方法有两个参数,第二个参数是一个block,只会被执行一次。而第一个参数是一个谓词,用于判断代码块(block)是否执行完,这个谓词只能是全局或静态变量,类型为dispatch_once_t,其实dispatch_once_t就是long类型。你可以理解为第一个参数是个标识位,能保证记录第二个参数block的执行情况,即使是在最复杂的多线程并发执行的情况下,也就是说,GCD的这个方法是线程安全的。如果你对block这种类型比较陌生,可以把它暂时当作函数指针,当然,它比函数指针还要强大。 你可以重写init方法来实现饿汉式单例,也可以自定义initwithXXX来在需要实例化的时候调用之,实现懒汉式单例。
本文内容:iOS的单例模式NSUserDefaults的使用总结:iOS单例模式 and NSUserDefaultsiOS的单例模式提起单例模式大家都不陌生,什么懒汉式,饿汉式,老汉式。。。扯远了一开始觉得Objective-C中没有绝对的私有方法,该如何实现单例模式呢?后来觉得想多了,限制构造方法的使用式徒劳的,因为程序是人写的,既然是单例了,那就老老实实调用自