单例模式
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文件中的改变
在单例是在
写到这里一个完整单例就完成了吗? no,no,no.…… 如果单例对象由多个线程访问的话,这时候保证它的线程安全就重要了。我们可以用GDD中的 dispatch_once 来进行线程安全当然前提是你的dispatch_once_t 对象必须是全局或者静态对象(static)。这一点很重要,如果不能保证这一点,也就不能保证该方法只会被执行一次
付一张单例的打印结果:
打印出来的内存地址可以看出来都是同一个。证明我们用两种初始化出来的单例是同一个。保证了单例的唯一性。单例创建于堆中,相当于一个全局的变量,系统不会去释放,如果我们想释放需要我们手动的去释放只要我们在里面加一个方法 使它等于nil 可以。 不过这样就感觉不像是单例了。 有什么补充可以直接提出来,互相进步
单例模式的意图是使得类的一个对象成为系统中的唯一实例。需要用一种允许生成对象类的唯一实例的机制,防止所有想要生成对象的访问。(说简单点就是,”单例就是披着羊皮的全局状态” ,一个单例可以在不需要显示声明对其依赖的情况下,被使用在任何地方。)。
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 可以。 不过这样就感觉不像是单例了。 有什么补充可以直接提出来,互相进步
相关文章推荐
- Android Native 绘图方法
- Python动态类型的学习---引用的理解
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 土人系列AS入门教程 -- 对象篇
- 交换机升级排障实例
- C#托管堆对象实例包含内容分析
- C#中struct和class的区别详解
- C#实现获取不同对象中名称相同属性的方法
- javascript asp教程第十一课--Application 对象
- PowerShell中使用Out-String命令把对象转换成字符串输出的例子
- VBS ArrayList Class vbs中的数组类
- VBS教程:对象-正则表达式(RegExp)对象
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- C#检查指定对象是否存在于ArrayList集合中的方法