A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


单例模式,实则上是只有一个实例,某一个类只能有一个实例,它需要自行创建,并且要向整个系统程序提供这个实例。
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



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马