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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Hi围城 中级黑马   /  2014-4-3 16:20  /  1470 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Hi围城 于 2014-4-3 20:24 编辑

如何设定一个单例模式,比如把一个person类设定成单例模式,它的对象以后就只有一个。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

3 个回复

倒序浏览
  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
复制代码

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
  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
复制代码




评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马