static Bee * sharesingleton = nil;
第一句定义一个静态的单例指针并初始化为空。首先单例模式就是要求类有唯一 一个实例并像外界提供返回这个实例创建的方法。为了保证实例的唯一性,创建出来的实例在内存中只有一个,因此用static修饰它,因为static修饰的变量程序生命周期最长且唯一。static修饰的变量一直贯穿于程序的始终,所以这个变量在内存中具有唯一性
+(Bee *)sharelstance
因为单例不能再创建其他对象,它只有一个实例对象,所以,实现类方法屏蔽对象方法,可以防止对象通过其他方法再次被创建破坏实例的唯一性。
{
if(sharesingleton == nil)
{
sharesingleton = [super allocWithZone:NULL] init];
}
这句if是先判断实例是否已经被创建,如果创建了就不再创建对象,否则,就创建一个实例对象。
因为单例模式就只有一个实例,如果不判断的话可能会出现多次调用类方法创建实例的情况这样单例就不唯一了。
最关键的一步应该是这个吧sharesingleton = [[super allocWithZone:NULL] init ];就是初始化一个实例给单例的指针。这个的写法的确有好多种,也可以写成这样sharesingleton = [[super alloc] init ];但是这样写会出现不安全的问题。解释如下:
使用alloc方法初始化一个类的实例的时候,默认是调用了 allocWithZone 的方法。于是覆盖allocWithZone方法的原因已经很明显了:为了保持单例类实例的唯一性,需要覆盖所有会生成新的实例的方法,如果有人初始化这个单例类的时候不走[[Class alloc] init] ,而是直接 allocWithZone, 那么这个单例就不再是单例了,所以必须把这个方法也堵上。因此这个sharesingleton = [[super allocWithZone:NULL] init ];写法使程序更健壮些。
return sharesingleton:
}