黑马程序员技术交流社区

标题: oc 单例模式的设定 [打印本页]

作者: Hi围城    时间: 2014-4-3 16:20
标题: oc 单例模式的设定
本帖最后由 Hi围城 于 2014-4-3 20:24 编辑

如何设定一个单例模式,比如把一个person类设定成单例模式,它的对象以后就只有一个。
作者: 于清扬    时间: 2014-4-3 16:52
  1. #import "Person.h"

  2. @implementation Person
  3. // 定义个全局变量(类方法中不能使用成员变量)
  4. static Person *_instace;
  5. // 重写allocWithZone:方法
  6. + (id)allocWithZone:(struct _NSZone *)zone
  7. {
  8.     // 只执行一次里面的代码即只分配一次内存空间,而且是线程安全的
  9.     static dispatch_once_t onceToken;
  10.     dispatch_once(&onceToken, ^{
  11.         _instace = [super allocWithZone:zone];
  12.     });
  13.    
  14.     return _instace;
  15. }

  16. // 提供工厂方法供外面使用
  17. + (instancetype)sharedPerson
  18. {
  19.     if (_instace == nil) {
  20.         _instace = [[Person alloc] init];
  21.     }
  22.     return _instace;
  23. }
  24. @end
复制代码

作者: 程浩    时间: 2014-4-3 16:53
  1. @implementation Singleton
  2. + (Singleton *)instance  {
  3.       static Singleton *instance;  //声明了静态变量,如果你有JAVA编程背景的话,这里或许会让你有点疑惑,在C(C++ 和 Objective-C)中,一个静态局部变量作用域存在于函数内,但是生命周期是整个程序,在下一次该函数调用时仍可使用 。(和java中的类静态变量被该类各个实例变量共有的特点相似)。
  4.   
  5.       @synchronized(self) {   //我们想使用线程保护,这样同时的两个[Singleton instance]调用不会产生两个独立的对象实例。即使在一个单线程程序中,这种     Synchronization不会有大的执行时间开销,而且这为以后开发 打下了好的基础。
  6.       if(!instance) {  //检查是否该类对象实例已经初始化。我们是否需要生成该类的实例。
  7.           instance = [[Singleton alloc] init];
  8.         }
  9.       }
  10.   
  11.      return instance;  //返回创建的/已存在的对象实例。
  12. }
  13. @end
复制代码





作者: Hi围城    时间: 2014-4-3 20:26
于清扬 发表于 2014-4-3 16:52

非常感谢!




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