顾名思义,单例,便是在整个项目中,这个类的对象只能被初始化一次。它的这种特性,能够普遍应用于某些须要全局共享的资源中,好比管理类,引擎类,也能够经过单例来实现传值。UIApplication、NSUserDefaults等都是IOS中的系统单例。程序员
单例的写法经常使用的有两种方式:设计模式
static SingleCase *manager = nil; + (SingleCase *)defaultManager { if (!manager){ SingleCase = [[self alloc] init]; return manager; } }
+ (SingleCase *)sharedManager { static SingleCase *ManagerInstance = nil; static dispatch_once_t predicate; dispatch_once(&predicate, ^{ ManagerInstance = [[self alloc] init]; }); return ManagerInstance; }
经过上面的方法,咱们已经可使用类方法来获得这个单例,但不少时候,项目的工程量很大,还有可能会不少开发者同时参与一个项目的开发,为了安全与管理代码的方便,也为了给不是这个单例的创做者但会用到这个单例的开发人员一些提示,咱们一般会重写一些方法:安全
首先咱们本身实现一个alloc方法:优化
+(instancetype)myAlloc{ return [super allocWithZone:nil]; }
将咱们的单例实现方法略做修改:spa
+(ZYHPayManager *)sharedMamager{ static ZYHPayManager * manager; if (manager==nil) { manager=[[ZYHPayManager myAlloc]init]; } return manager; }
将一些视图实例化对象的方法重写:线程
+(instancetype)alloc{ NSAssert(0, @"这是一个单例对象,请使用+(ZYHPayManager *)sharedMamager方法"); return nil; } +(instancetype)allocWithZone:(struct _NSZone *)zone{ return [self alloc]; } -(id)copy{ NSLog(@"这是一个单例对象,copy将不起任何做用"); return self; } +(instancetype)new{ return [self alloc]; }
注意:这里的alloc使用了断言,让任何视图经过alloc建立对象的程序段断在此处,给程序员提示。copy方法这里只是简单的返回了原对象,并未作任何处理,打印信息给程序员提示。设计
专一技术,热爱生活,交流技术,也作朋友。code
——珲少 QQ群:203317592对象