黑马程序员技术交流社区

标题: 静态方法问题 [打印本页]

作者: 啊康    时间: 2014-4-21 21:43
标题: 静态方法问题
static Bee  *sharesingleton=nil;
+(Bee *)shareIstance
{
    if (sharesingleton == nil) {
        sharesingleton = [[super allocWithZone:NULL] init ];
    }
    return sharesingleton;
}
上面的代码是单例设计中为了保证对象创建唯一性的方法,但是看不懂,请各位帮我解释下!


作者: 戴文婷    时间: 2014-4-21 22:22
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; 只能被赋值一次。

作者: Freedam    时间: 2014-4-24 21:54
  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 ];写法使程序更健壮些。
作者: 李烨    时间: 2014-4-24 22:29
  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. }
复制代码





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