Objective C--单例模式
来源:互联网 发布:评价耶稣知乎 编辑:程序博客网 时间:2024/04/29 00:29
转载地址 http://ohcoder.com/blog/2012/12/01/singleton-pattern/
今天想和大家一起分享的是单例模式。顾名思义,单例模式的特点就是保证一个类仅有一个实例。因为这个模式只和一个类有关,没有类与类之间的关系,所有就不给出图示了。那么还是先说一下基本的定义。
单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。
通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。平时,我们常用单例模式的地方通常是多线程。
因为Objective C传承了Smalltalk语言,所以在Objective C中实现单例模式和C++和C#以及Java都不太一样。因为要保证类型对象的单一性,所以就要考虑Objective C在实例化对象时候的各种方式。因为在Objective C中创建的各个类型都继承自NSObject类型,所以我们需要考虑NSObject类型里实例化的方法,下面让我们展开来说。
在Objective C的实例化对象的方式主要有三种,分别如下:
- obj = [NSObject new];
- obj = [[NSObject alloc]init];
- obj = [[NSObject allocWithZone]init];
NSObject类参考文档里记录第三种方法是因为历史原因遗留下来的,在当前的Objective C中已经不再使用,所以我们就不考虑这种方式了。下面让我们主要看一下前两种方式。
第一种方式,用new方法初始化其实是第二种方式的总和,当调用new方法时,其实是先调用了alloc方法进行isa(is a pointer)操作,创建指针,指向内存中的数据结构,紧接着调用了init方法对数据进行初始化,NSObject类参考文档里也有具体的说明,大家也可以查看文档,具体实现方式随后我会用代码向大家进行展示。
第二种方式看起来就很明确了,先调用alloc创建指针指向内存中的数据结构,再调用init方法初始化数据。这里需要注意的是,init方法只是起到了初始化数据的作用,其实也可以自定义初始化方法,即完全可以自定义一个普通返回NSObject类型的方法来代替init方法,即init方法是可以随意被代替的。只不过NSObject类型中new方法默认会调用init方法而已,init方法可以看作是NSObject类型的默认构造函数。
所以综上所述,其实只有alloc方法是每次必须调用的方法,那么我们只要控制住alloc方法,对此方法进行覆盖就可以保证类型对象的单一性了。好了,说了这么多,让我们看看如何实现吧。
注意:本文所有代码均在ARC环境下编译通过。
- Singleton类接口
- Singleton类实现
- Main方法调用
在Main方法中,当调用new方法进行第二次实例化的时候你会发现,Singleton类型的alloc方法第二次被调用了,并打印出“不好意思,你在实例化第二个对象”的语句。至此,不管是调用new方法还是调用alloc方法,还是调用自定义的GetInstance方法都只能生成一个对象实例。
有的同学可能不太清楚@synchronized(){…}功能是什么,简单的说是线程锁,起到访问互斥的作用,详细见这里。
好啦,至此,一个简单的单例模式就实现了。其实,在Objective C里实现单例模式还是有一些其他的争议的,比如说如何实现的更合理之类的,这里只是给出了一种方式而已,有兴趣的大家可以Google一下。
- Objective C--单例模式
- Objective C--单例模式
- Objective C 单例模式
- Objective C--单例模式
- Objective-C单例模式
- Objective C--单例模式
- Objective-C单例模式
- Objective-C 单例模式
- Objective-C 单例模式
- Objective-C:单例模式
- Objective-C 单例模式
- Objective C 中实现单例模式
- Objective C 实现Singleton(单例)模式.
- Objective-C实现单例模式
- Objective-C 设计模式之单例
- 【Objective-C】单例模式的实现
- Objective —C 单例模式 Singleton
- Objective-c中的单例设计模式
- margin-top、top、以及position的总结
- 最佳网上娱乐城
- 父窗体在iframe中找节点问题
- popupWindow 指定位置上的显示
- 虚基类练习 动物1
- Objective C--单例模式
- Activity添加Fragment防止重复添加
- 联想笔记本免费WiFi上网详解
- 你可以使用 play framework 做5件很爽的事情
- Android 中比 Timer 更好方法
- 经纬财富:酒泉现货投资优势常识
- JAVA 计算两个经纬度关系计算
- [LeetCode]—Subsets 求数组子集
- 基于支持向量机与LIBS光谱技术做定量分析研究——记我的毕业论文