黑马程序员技术交流社区

标题: 单例设计模式 [打印本页]

作者: 楠瓜果    时间: 2014-7-20 23:33
标题: 单例设计模式
单例设计模式这个我好像之前在群里看到过

作者: istream    时间: 2014-7-20 23:45
设计模式好好看看,iPhone开发中有很多设计模式,也是一开始初学者不太容易弄明白的地方,有单例模式,MVC模式,代理模式,观察者模式。
作者: 楠瓜果    时间: 2014-7-21 00:30
istream 发表于 2014-7-20 23:45
设计模式好好看看,iPhone开发中有很多设计模式,也是一开始初学者不太容易弄明白的地方,有单例模式,MVC ...

好的,谢谢我知道了
作者: 阳光地带    时间: 2014-7-21 04:33
应用场景: 当只需要某个类的唯一对象的使用使用单例模式。也就是保证这个类仅有一个实例,并且这个实例可以被全局访问。
实现代码
  1. //Singleton.h
  2. #import <Foundation/Foundation.h>

  3. @interface Singleton : NSObject
  4. @property NSString *singletonData;
  5. + (Singleton*)sharedManager;
  6. @end


  7. //Singleton.m
  8. #import "Singleton.h"

  9. @implementation Singleton

  10. static Singleton *sharedManager = nil;

  11. + (Singleton*)sharedManager
  12. {
  13.     static dispatch_once_t once;
  14.     dispatch_once(&once, ^{
  15.         sharedManager = [[self alloc] init];
  16.     });
  17.     return sharedManager;
  18. }

  19. @end
复制代码

说明:dispatch_once的作用是只执行一次代码块
^{sharedManager=[[self alloc] init];}
保证Singleton的实例只能被创建一次。
作者: 温天恩    时间: 2014-7-21 08:29
你的问题是什么?
作者: 我是一只小小强    时间: 2014-7-21 14:50
sharedManager=[[self alloc] init];
这里如果用 [[Singleton alloc]init],在下面重写alloc方法,alloc方法中会报野指针的错吗?我好像就报错了
换成另一种表达式就对了,谁能给我解释下
作者: 楠瓜果    时间: 2014-7-21 23:22
我是一只小小强 发表于 2014-7-21 14:50
sharedManager=[[self alloc] init];
这里如果用 [[Singleton alloc]init],在下面重写alloc方法,alloc方法 ...

谢谢 你
作者: 阳光地带    时间: 2014-7-21 23:32
我是一只小小强 发表于 2014-7-21 14:50
sharedManager=[[self alloc] init];
这里如果用 [[Singleton alloc]init],在下面重写alloc方法,alloc方法 ...

alloc方法是对象方法,不是类方法,所以通过对象调用,不能通过类名来调用。alloc方法不需要重写,可以重写init方法。
作者: 我是一只小小强    时间: 2014-7-22 13:19
阳光地带 发表于 2014-7-21 23:32
alloc方法是对象方法,不是类方法,所以通过对象调用,不能通过类名来调用。alloc方法不需要重写,可以重 ...

上面的类对象我没注意到,单例模式是要实现使用任何方式都只能创建出一个对象,所有就要重写alloc、copy、retain所有能添加对象的方法,创建如果存在就返回已经存在的对象,init是初始化对象内变量的对象方法而已,对了,还要重写release才能保证已创建的对象的计数器不会减少,避免对象消失,这才是单例模式的要求哦




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2