您的位置:首页 > 移动开发 > IOS开发

单例模式

2016-06-04 07:32 357 查看
1 什么是单例模式?

单例模式的意图是使得类的一个对象成为系统中的唯一实例。需要用一种允许生成对象类的唯一实例的机制,防止所有想要生成对象的访问。(说简单点就是,”单例就是披着羊皮的全局状态” ,一个单例可以在不需要显示声明对其依赖的情况下,被使用在任何地方。)。

2 什么时候用单例?

1 类只能一个实例,而且必须从一个为人熟悉的访问点对其进行访问,比如可以用工厂方法

2 这个唯一的实例只能通过子类化进行拓展,而且拓展的对象不会破坏客户端的代码。

3 单例的三个要点:

1. 该类有且只有一个实例;

2. 该类必须能够自行创建这个实例;

3. 该类必须能够自行向整个系统提供这个实例。

4 OC实现单例模式

创建一个继承于NSObjcet.h的类LBSingletion



1) 最简单的方法:

1. LBSingletion.h中创建一个可以访问的静态方法



2 在LBSingletion.m中去初始化这个实例



上面是一个最简单也是不安全的一个方法,我们要想到要让发起调用的对象不能用其他分配方式实例化单例对象。否则就有可能创建单例的多个实例。还有就是对单例实例化的限制应该与引用技术内存模型共存

2)另一个更合适OC的单例创建

其中 .h文件中方法是一样的,这里只就展示.m文件中的改变



在单例是在
+ (id)allocWithZone:(struct _NSZone)
只是返回从shareInstance方法返回的类实例,而且重载了
- (id)copyWithZone:(NSZone *)zone*)zone
方法以保证不会返回实例的副本。

写到这里一个完整单例就完成了吗? no,no,no.…… 如果单例对象由多个线程访问的话,这时候保证它的线程安全就重要了。我们可以用GDD中的 dispatch_once 来进行线程安全当然前提是你的dispatch_once_t 对象必须是全局或者静态对象(static)。这一点很重要,如果不能保证这一点,也就不能保证该方法只会被执行一次



付一张单例的打印结果:



打印出来的内存地址可以看出来都是同一个。证明我们用两种初始化出来的单例是同一个。保证了单例的唯一性。单例创建于堆中,相当于一个全局的变量,系统不会去释放,如果我们想释放需要我们手动的去释放只要我们在里面加一个方法 使它等于nil 可以。 不过这样就感觉不像是单例了。 有什么补充可以直接提出来,互相进步
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  对象 实例 class iOS