单例模式,实则上是只有一个实例,某一个类只能有一个实例,它需要自行创建,并且要向整个系统程序提供这个实例。 1.单例模式的实现思路 1. 定义一个私有的实例 2. 用一个类方法,完成实例的共享(******核心*******) 3. 屏蔽有关创建销毁实例的方法,限制这个类只能创建一个对象 2.单例模式的应用场景 1.单例对象可以存储一些共享的信息,每个对象都能访问和修改 2.如果一个类的创建非常耗费性能,那么这个类最好设计为单例,只创建一次节约性能
3.单例模式的代码实现 - /****************************第一步****************************/
- static ContactBook *shareBook = nil; //在静态区新建对象
- @implementation ContactBook
- /****************************第二步****************************/
- + (ContactBook *) sharedInstance //建一个方法,共享这个对象
- {
- @synchronized (self) //@synchronized是加锁,相当于单线程
- {
- if (sharedBook == nil) //如果这个对象没有被创建
- {
- [[self alloc] init]; //就创建这个对象并初始化
- }
- }
- return shareBook; //返回这个对象
- }
- /****************************第三步****************************/
- + (id) allocWithZone:(NSZone *)zone //alloc方法
- {
- @synchronized (self) { //也是单线程
- if (shareBook == nil) { //如果对象没有被创建,就创建这个对象
- shareBook = [super allocWithZone:zone]; //调用父类alloc方法
- }
- }
- return shareBook; //返回这个对象
- }
- - (id) copyWithZone:(NSZone *)zone //复制方法
- {
- return self; //因为已经被创建,直接返回这个对象,不让再创建
- }
- - (id) retain //计数器加1,也屏蔽掉,这个方法不写也可以
- {
- return self;
- }
- - (unsigned) retainCount //计数器一直让它为最大值,保证对象不被销毁
- {
- return UINT_MAX;
- }
- - (oneway void) release //计数器减1,也屏蔽掉,也是为了保证对象不被销毁
- {
- }
- - (id) autorelease //自动释放也屏蔽掉,直接返回对象
- {
- return self;
- }
- - (id)init //初始化对象
- {
- @synchronized(self) { //加锁
- [super init]; //调用父类方法,这个死规矩
- //往往放一些要初始化的变量.
- return self;
- }
- }
- @end
|