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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 啊康 中级黑马   /  2014-4-21 21:43  /  1133 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

static Bee  *sharesingleton=nil;
+(Bee *)shareIstance
{
    if (sharesingleton == nil) {
        sharesingleton = [[super allocWithZone:NULL] init ];
    }
    return sharesingleton;
}
上面的代码是单例设计中为了保证对象创建唯一性的方法,但是看不懂,请各位帮我解释下!

评分

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

查看全部评分

3 个回复

倒序浏览
static Bee  *sharesingleton=nil;// static 表明是Bee类的类指针,意思是,整个程序中只创建一份
+(Bee *)shareIstance
{// 类方法中,判断,如果sharesingleton 没有被指向任何对象,就创建Bee对象并复制,如果sharesingleton 已经有指向的对象了,就说明被Bee已经被创建过了。就不在创建直接返回sharesingleton
    if (sharesingleton == nil) {
        sharesingleton = [[super allocWithZone:NULL] init ];
    }
    return sharesingleton;

关键点:static Bee  *sharesingleton=nil; 只能被赋值一次。
回复 使用道具 举报
  1. static Bee  *sharesingleton=nil;
复制代码

第一句定义一个静态的单例指针并初始化为空。首先单例模式就是要求类有唯一 一个实例并像外界提供返回这个实例创建的方法。为了保证实例的唯一性,创建出来的实例在内存中只有一个,因此用static修饰它,因为static修饰的变量程序生命周期最长且唯一。static修饰的变量一直贯穿于程序的始终,所以这个变量在内存中具有唯一性。

  1. +(Bee *)shareIstance
复制代码

因为单例不能再创建其他对象,它只有一个实例对象,所以,实现类方法屏蔽对象方法,可以防止对象通过其他方法再次被创建破坏实例的唯一性。

  1. if (sharesingleton == nil) {
  2.         sharesingleton = [[super allocWithZone:NULL] init ];
  3.     }
复制代码

这句if是先判断实例是否已经被创建,如果创建了就不再创建对象,否则,就创建一个实例对象。
因为单例模式就只有一个实例,如果不判断的话可能会出现多次调用类方法创建实例的情况这样单例就不唯一了。
最关键的一步应该是这个吧sharesingleton = [[super allocWithZone:NULL] init ];就是初始化一个实例给单例的指针。这个的写法的确有好多种,也可以写成这样sharesingleton = [[super alloc] init ];但是这样写会出现不安全的问题。解释如下:
使用alloc方法初始化一个类的实例的时候,默认是调用了 allocWithZone 的方法。于是覆盖allocWithZone方法的原因已经很明显了:为了保持单例类实例的唯一性,需要覆盖所有会生成新的实例的方法,如果有人初始化这个单例类的时候不走[[Class alloc] init] ,而是直接 allocWithZone, 那么这个单例就不再是单例了,所以必须把这个方法也堵上。因此这个sharesingleton = [[super allocWithZone:NULL] init ];写法使程序更健壮些。
回复 使用道具 举报 1 0
  1. static Bee  *sharesingleton=nil;
  2. +(Bee *)shareIstance // 这是一个类方法用来创建这个类唯一的实例对象
  3. {
  4.     // 这里的if语句就是判断这个类的对象是否被创建过,如果创建过就不在创建,如果没创建过,就可以创建
  5.     if (sharesingleton == nil) {
  6.         sharesingleton = [[super allocWithZone:NULL] init ]; // 这里就是创建一次对象
  7.     }
  8.     return sharesingleton;
  9. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马