Objective-c正确的写法单身
2015-09-22 16:03
417 查看
Singleton模式iOS发展可能是其中最常用的模式中使用的。但是因为oc语言特性本身,想要写一个正确的Singleton模式是比较繁琐,iOS中单例模式的设计思路。
关于单例模式很多其它的介绍请參考这篇文章。
单例顾名思义就是说一个类的实例仅仅能有一个。在java、C++这类语言中,能够通过将构造函数私有化来避免对象的反复创建。可是objective-c却不能够这样做,我们须要通过其它机制来达到这个目的。普通情况下,可能我们写的单例模式是这种:
输出结果为 :
那么问题就来了。我们通过不同的途径得到不同的对象,显然是不行的。我们必须要确保对象的唯一性,所以我们就须要封锁用户通过alloc和init以及copy来构造对象这条道路。
我们知道,创建对象的步骤分为申请内存(alloc)、初始化(init)这两个步骤,我们要确保对象的唯一性,因此在第一步这个阶段我们就要拦截它。
当我们调用alloc方法时,oc内部会调用allocWithZone这种方法来申请内存。我们覆写这种方法,然后在这种方法中调用shareInstance方法返回单例对象,这样就能够达到我们的目的。拷贝对象也是相同的原理,覆写copyWithZone方法,然后在这种方法中调用shareInstance方法返回单例对象。看代码吧:
再看看效果怎样:
输出结果:
思路就是这样。假设有更为严格的措词请留言,通知。谢谢~
关于单例模式很多其它的介绍请參考这篇文章。
单例顾名思义就是说一个类的实例仅仅能有一个。在java、C++这类语言中,能够通过将构造函数私有化来避免对象的反复创建。可是objective-c却不能够这样做,我们须要通过其它机制来达到这个目的。普通情况下,可能我们写的单例模式是这种:
#import <Foundation/Foundation.h> @interface Singleton : NSObject +(instancetype) shareInstance ; @end #import "Singleton.h" @implementation Singleton static Singleton* _instance = nil; +(instancetype) shareInstance { static dispatch_once_t onceToken ; dispatch_once(&onceToken, ^{ _instance = [[self alloc] init] ; }) ; return _instance ; } @end详细使用:
#import <Foundation/Foundation.h> #import "Singleton.h" int main(int argc, const char * argv[]) { @autoreleasepool { Singleton* obj1 = [Singleton shareInstance] ; NSLog(@"obj1 = %@.", obj1) ; Singleton* obj2 = [Singleton shareInstance] ; NSLog(@"obj2 = %@.", obj2) ; // Singleton* obj3 = [[Singleton alloc] init] ; NSLog(@"obj3 = %@.", obj3) ; } return 0; }
输出结果为 :
2014-12-15 16:06:28.344 ObjcSingleton[8847:303] obj1 = <Singleton: 0x1001086e0>. 2014-12-15 16:06:28.346 ObjcSingleton[8847:303] obj2 = <Singleton: 0x1001086e0>. 2014-12-15 16:06:28.346 ObjcSingleton[8847:303] obj3 = <Singleton: 0x100103940>.能够看到。当我们调用shareInstance方法时获取到的对象是相同的,可是当我们通过alloc和init来构造对象的时候。得到的对象却是不一样的。
那么问题就来了。我们通过不同的途径得到不同的对象,显然是不行的。我们必须要确保对象的唯一性,所以我们就须要封锁用户通过alloc和init以及copy来构造对象这条道路。
我们知道,创建对象的步骤分为申请内存(alloc)、初始化(init)这两个步骤,我们要确保对象的唯一性,因此在第一步这个阶段我们就要拦截它。
当我们调用alloc方法时,oc内部会调用allocWithZone这种方法来申请内存。我们覆写这种方法,然后在这种方法中调用shareInstance方法返回单例对象,这样就能够达到我们的目的。拷贝对象也是相同的原理,覆写copyWithZone方法,然后在这种方法中调用shareInstance方法返回单例对象。看代码吧:
#import "Singleton.h" @implementation Singleton static Singleton* _instance = nil; +(instancetype) shareInstance { static dispatch_once_t onceToken ; dispatch_once(&onceToken, ^{ _instance = [[super allocWithZone:NULL] init] ; }) ; return _instance ; } +(id) allocWithZone:(struct _NSZone *)zone { return [Singleton shareInstance] ; } -(id) copyWithZone:(struct _NSZone *)zone { return [Singleton shareInstance] ; } @end
再看看效果怎样:
main : #import <Foundation/Foundation.h> #import "Singleton.h" int main(int argc, const char * argv[]) { @autoreleasepool { Singleton* obj1 = [Singleton shareInstance] ; NSLog(@"obj1 = %@.", obj1) ; Singleton* obj2 = [Singleton shareInstance] ; NSLog(@"obj2 = %@.", obj2) ; // Singleton* obj3 = [[Singleton alloc] init] ; NSLog(@"obj3 = %@.", obj3) ; Singleton* obj4 = [[Singleton alloc] init] ; NSLog(@"obj4 = %@.", [obj4 copy]) ; } return 0; }
输出结果:
2014-12-15 16:11:24.734 ObjcSingleton[8979:303] obj1 = <Singleton: 0x100108720>. 2014-12-15 16:11:24.735 ObjcSingleton[8979:303] obj2 = <Singleton: 0x100108720>. 2014-12-15 16:11:24.736 ObjcSingleton[8979:303] obj3 = <Singleton: 0x100108720>. 2014-12-15 16:11:24.736 ObjcSingleton[8979:303] obj4 = <Singleton: 0x100108720>.能够看到获取到的对象都是一样的了。
思路就是这样。假设有更为严格的措词请留言,通知。谢谢~
相关文章推荐
- Objective-C-------NSDictionay按照字母的顺序显示字典中的内容
- Spring中的jdbcTemplate.queryForObject()使用
- webservice调用报object is not an instance of declaring class错
- C++ 11 - STL - 函数对象(Function Object) (上)
- Objective-C之数据持久化-SQLite
- Objective-C之数据持久化-对象归档
- JSONObject简介
- MyBatis中对List<Object> 对象List的批处理插入操作
- Android项目中如果json字符串中key-value顺序很重要,不要使用Android自带的JSONObject
- Objective-C类型推断
- Objective-C Block闭包概念解析
- 2015 Objective-C 三大新特性
- Objective-C---1---类的有关基本概念
- Objective-C字典使用详解
- Android保存List<Map<String,Object>>数据到SD卡及读取
- SAP表的锁定与解锁
- Objective-C可变数组的声明与使用
- 问题-XE8报Object factory for class{xx-xx-xx-xx-xx} is missing. To register it, you can drop component[TFDGUIxWaitCursor] into your project.
- Objective-C block实现代码分析
- 基于Objective-C的面向对象编程入门