ios——如何写一个单例
2017-02-16 16:05
134 查看
单例指的是在整个工程当中这个类只有一个实例,当你希望整个工程当中这个类只存在一个对象的时候,你就可以来使用单例模式,今天就来
4000
讨论一下如何实现一个单例。
你一定是用过单例的,因为我们每个工程的入口AppDelegate就是一个单例,任何写到单例里头的实例都是一个单例,所以我们可以借助AppDelegate来实现一个单例。
我们来创建一个类来实现单例,他有一个属性叫做“name”;
我们在AppDelegate.h中引入他的头文件,并给AppDelegate添加一个属性:
并在AppDelegate.m中实现他:
好的这样我们不管从工程的任何位置,通过AppDelegate来获取到这个single属性,他都是一个单例,因为他在AppDelegate中一个实例,比如我们在Controller中获取到他:
这样的确是实现了一个单例,但是不管怎么看他都不够优雅,所以我们还有显得更加优雅的方式来实现一个单例。
这个宏可以保证代码块中的代码只执行一次,同时是线程安全的,那么用来创建单例实在是再合适不过了,我们知道类的init方法其实都会调用底层的
所以我们可以重载此方法保证初始化方法返回的是同一个对象。
我们首先创建一个静态全局对象
其实这个对象就相当于上面我们在AppDelegate中实例化的那个对象。
我们重载allocWithZone方法:
当我们重载这个初始化方法以后我们所有希望使用init新建对象都会返回我们的_instance对象。
我们写一个静态方法来获取这个单例:
这是写在.m文件中的方法实现,当然我们需要在.h文件中声明这个方法。
好的,现在到了验证时间了,我们到界面上,创建多个singleObject,然后输出他的name,如果每次我们新建的singleObject的name是相同的,那么我们可以认定这是一个单例了:
我们创建了两个singleObject对象,我们来看一下他的输出:
两次输出是一样的,那么我们可以认定这个单例创建成功了。
代码参考:http://pan.baidu.com/s/1bpnvNHl
4000
讨论一下如何实现一个单例。
单例其实很常见
你一定是用过单例的,因为我们每个工程的入口AppDelegate就是一个单例,任何写到单例里头的实例都是一个单例,所以我们可以借助AppDelegate来实现一个单例。我们来创建一个类来实现单例,他有一个属性叫做“name”;
我们在AppDelegate.h中引入他的头文件,并给AppDelegate添加一个属性:
@property (nonatomic, strong) singleObject *single;
并在AppDelegate.m中实现他:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { _single = [[singleObject alloc]init]; _single.name = @"I am singleMode"; return YES; }
好的这样我们不管从工程的任何位置,通过AppDelegate来获取到这个single属性,他都是一个单例,因为他在AppDelegate中一个实例,比如我们在Controller中获取到他:
AppDelegate *appdelegate = (AppDelegate *)([UIApplication sharedApplication].delegate); NSLog(@"%@",[NSString stringWithFormat:@"%@",appdelegate.single.name]); appdelegate.single.name = @"I can change everyWhere"; NSLog(@"%@",[NSString stringWithFormat:@"%@",appdelegate.single.name]);
这样的确是实现了一个单例,但是不管怎么看他都不够优雅,所以我们还有显得更加优雅的方式来实现一个单例。
使用GCD的宏 dispatch_once
这个宏可以保证代码块中的代码只执行一次,同时是线程安全的,那么用来创建单例实在是再合适不过了,我们知道类的init方法其实都会调用底层的+(id)allocWithZone:(struct _NSZone *)zone;
所以我们可以重载此方法保证初始化方法返回的是同一个对象。
我们首先创建一个静态全局对象
static id _instance = nil;
其实这个对象就相当于上面我们在AppDelegate中实例化的那个对象。
我们重载allocWithZone方法:
+(id)allocWithZone:(struct _NSZone *)zone{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [super allocWithZone:zone]; }); return _instance; }
当我们重载这个初始化方法以后我们所有希望使用init新建对象都会返回我们的_instance对象。
我们写一个静态方法来获取这个单例:
+(instancetype)shareSingle{ return [[self alloc]init]; }
这是写在.m文件中的方法实现,当然我们需要在.h文件中声明这个方法。
好的,现在到了验证时间了,我们到界面上,创建多个singleObject,然后输出他的name,如果每次我们新建的singleObject的name是相同的,那么我们可以认定这是一个单例了:
singleeObject *single = [singleObject shareSingle]; single.name = @"I am create by dispath_once"; NSLog(@"%@",single.name); singleObject *singleObject2 = [singleObject shareSingle]; NSLog(@"%@",singleObject2.name);
我们创建了两个singleObject对象,我们来看一下他的输出:
两次输出是一样的,那么我们可以认定这个单例创建成功了。
代码参考:http://pan.baidu.com/s/1bpnvNHl
相关文章推荐
- 发布iOS应用全攻略(一)——如何成为一个合法的iOS开发者
- 发布iOS应用全攻略(一)——如何成为一个合法的iOS开发者
- 如何架构一个单独的代码核心模块:IOS Image Cache demo
- iOS杂谈9—如何成为一个合法的iOS开发者
- iOS 如何在一个应用程序中调用另一个应用程序
- Flash发布iOS应用全攻略(二)——如何成为一个合法的iOS开发者
- Flash发布iOS应用全攻略(二)——如何成为一个合法的iOS开发者
- ios开发如何批量打包?如何让同一个程序在一个手机上多次安装时不覆盖以前安装的,而是重新生成一个新的
- 一个独立开发者的自白:我如何在一年赚得60万美元 from http://www.csdn.net/article/2012-12-20/2813024-ios-educational-market
- iOS中如何创建一个滑出式导航面板(1)
- 如何成为一个合法的iOS开发者
- Flash发布iOS应用全攻略(二)——如何成为一个合法的iOS开发者
- 如何写一个使用Web Service的IOS应用
- 如何在iOS中使用ZXing库(ZXing是一个开源的条码生成和扫描库,开源协议为Apache2.0。它持众多条码格式和语言,比如Java、 C++、 C#、 Objective-C以及Act )
- 判断一个类是否支持某属性和方法以及如何判断IOS的版本
- Flash发布iOS应用全攻略(二)——如何成为一个合法的iOS开发者
- 如何定义一个应用之间调用的ios 本地URL
- ios如何打包成一个通用的静态库文件
- iOS 如何在一个应用程序中调用另一个应用程序
- iOS中如何创建一个滑出式导航面板(2)