iOS单例模式

·  阅读 159

1.什么是单例模式

单例模式(Singleton Pattern)是 iOS 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

注意:

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。

2.如何定义一个单例类

单例类既然是一个全局的类,那么我们就要考虑到他的多种初始化方式。

1.[NSObject alloc]init];

2.[NSObject Copy];  

3.[NSObject mutableCopy];

4.封装的单例方法 shareInstance;

首先我们来单纯的实现一个单例

+(id)shareInstance{
    static Dog *instance = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        instance = [[super allocWithZone: NULL]init];
    });

    return instance;
}

自定义类是一定要实现copyWithZone和mutableCopyWithZone的重写,因为通过copy和mutableCopy创建对象的方式太常见了。而且不重写的话,直接调用copy或者mutableCopy也会报错的,会找不到这个方法的。

-(id)copyWithZone:(struct _NSZone *)zone{
    return self;
}

-(id)mutableCopyWithZone:(struct _NSZone *)zone{
    return self;
}

我们没有实现alloc的重写,我们来看下copy,mutableCopy和shareInstance的地址是否一样就能分辨出他们是不是同一个对象。

0x6000007f82a0------0x6000007f82a0------0x6000007f8320------0x6000007f82a0

四个地址分别为:shareInstace,copy,alloc,mutableCopy。

很明显,通过alloc创建的对象跟其他三种方法创建的不一样。那我们重写一下allocWithZone。

+(id)allocWithZone:(struct _NSZone *)zone{
    return [self shareInstance];
}

再次打印,我们看下效果。

0x60000345c360------0x60000345c360------0x60000345c360------0x60000345c360

很明显,通过四种方式创建的都是同一个对象。所以如果要完整的创建一个iOS单例对象,需要注意三点:

1.重写allocWithZone,保证alloc的对象跟shareInstace的一致

2.重写copyWithZone,保证alloc的对象跟shareInstace的一致

3.重写mutableCopyWithZone,保证alloc的对象跟shareInstace的一致

分类:
iOS
标签:
分类:
iOS
标签:
收藏成功!
已添加到「」, 点击更改