iOS 单例模式 详解_第1页
iOS 单例模式 详解_第2页
iOS 单例模式 详解_第3页
iOS 单例模式 详解_第4页
iOS 单例模式 详解_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、如果你准备写一个类,希望保证只有一个实例存在,同时可以得到这个特定实例提供服务的入口,那么可以使用单态设计模式。单态模式在Java、C+中很常用,在Cocoa里,也可以实现。但是,Objective-C的单例模式绝对和你所想象不一样,他的写法和你所见过的所有语言的写法都不一样。 官方建议 由于自己设计单态模式存在一定风险,主要是考虑到可能在多线程情况下会出现的问题,因此苹果官方建议使用以下方式来实现单态模式:static MyGizmoClass *sharedGizmoManager = nil; + (MyGizmoClass*)sharedManager  

2、   synchronized(self)         if (sharedGizmoManager = nil)             self alloc init; / assignment not done here                 ret

3、urn sharedGizmoManager; + (id)allocWithZone:(NSZone *)zone     synchronized(self)         if (sharedGizmoManager = nil)             sharedGizmoManager = super allocWithZone:zone;   

4、0;         return sharedGizmoManager;  / assignment and return on first allocation                 return nil; /on subsequent allocation attempts return nil - (id)copyWithZone:(NSZone *)zone

5、     return self; - (id)retain     return self; - (unsigned)retainCount     return UINT_MAX;  /denotes an object that cannot be released - (void)release     /do nothing - (id)autorelease     return self;  开源模板(见附件下载

6、)程序员都是偷懒的,现在流行使用一个宏定义来搞定这许多的事,而且考虑的更加周全。单例包含以下接口 + (MyClass*) sharedInstance; + (void) purgeSharedInstance; 调用sharedInstance会创建并返回单例调用purgeSharedInstance会销毁单例手动调用alloc也可以保证是单例,你可以这样调用MyClass alloc initWithParam:firstParam secondParam:secondParam;只是要保证在sharedInstance之前调用,因为只有一次创建机会。下面是使用宏的写法“ My

7、Class.h: =     #import "SynthesizeSingleton.h"     interface MyClass: SomeSuperclass             .         SYNTHESIZE_SINGLETON_FOR_CLASS_HEADER(MyClass);     end =

8、    MyClass.m: =     #import "MyClass.h"     implementation MyClass     SYNTHESIZE_SINGLETON_FOR_CLASS(MyClass);     .     end =   定义:单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在,而且自

9、行实例化并向整个系统提供这个实例。这个类称为单例类。    要点: 1、某个类只能有一个实例           2、它必须自行创建这个实例           3、它必须向整个系统提供这个实例    优点:1、实例控制:Singleton会阻止其他对象实例化其自己的Singleton 对象的副本,从而确保所有对象都访问唯一实例。

10、0;         2、灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程。    实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个方法名);当我们调用这个方法时,如果类持有的引用不为恐就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用负于该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过

11、该类提供的静态方法来得到该类的唯一实例。    IOS中的单例模式       在Objective-C 中要实现一个单例类,至少需要做以下四个步骤:       1、为单例对象实现一个静态实例,并初始化,然后设置成nil;       2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例;       3、重写allocWit

12、hZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例;       4、适当实现allocWithZone,copyWithZone,release和autorelease。    单例模式在多线程的应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会较

13、低效率,但是安全)。ARC模式下使用单例,首先创建一个SingletonExample类,下面是SingletonExample.h文件中的:#import interface SingletonExample : NSObject +(SingletonExample *)sharedInstance; end然后就是SingletonExample.m中的#import “SingletonExample.h” interface SingletonExample () -(id)initialize; end implementation SingletonExample +(Singl

14、etonExample *)sharedInstance   static SingletonExample *sharedSingleton = nil;   static dispatch_once_t onceToken;   dispatch_once(&onceToken,(void)     sharedSingleton = self alloc initialize;  );   return sharedSingleton; -(id)initialize    if(self

15、= super init )       /initial something here     return self; end如果代码的目标想兼容iOS 4以下的系统,那么上述代码中的sharedInstance方法里面的GCD便不能用了,可以用下面的方法进行替代+(SingletonExample *)sharedInstance   static SingletonExample *sharedSingleton = nil; /第一步:静态实例,并初始化。    synchronize

16、d(SingletonExample class) /第二步:实例构造检查静态实例是否为nil     if(sharedSingleton = nil)              sharedSingleton = self alloc initialize;           return sharedSingleton; 这样的话就能兼容所有的iOS设备了,不

17、过synchronize貌似不太好用,效率相比GCD比较低。dispatch_once_t或者是synchronized方法,保证线程安全上面这些方法呢,都是在ARC下面使用的,如果使用的非ARC,其实也很简单,在SingletonExample.m中加入下面这些即可:-(id)allocWithZone:(NSZone *)zone /第三步:重写allocWithZone方法    synchronized (self)         if (sharedSingleton= nil) &

18、#160;           sharedSingleton= super allocWithZone:zone;            return sharedSingleton;                return nil;-(id)copyWithZone:(NSZone *)zone /第四步:适当实现    return self;- (id)retain    return self;- (unsigned)retainCount 

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论