iOS单例的创建与销毁
来源:互联网 发布:photoshop cc mac版本 编辑:程序博客网 时间:2024/04/30 12:31
在iOS的日常开发经常要用到单例,单例一经创建就不会销毁,直到APP被杀掉的时候单例占用的空间才得以释放.现在比如我有一个自行车类,并且把它写成一个单例(共享自行车,呵呵),代码如下:
#import "Bike.h"@implementation Bike+ (instancetype)sharedBike{ static Bike *bike; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ bike = [Bike new]; }); return bike;}@end
相信大家一般都是这么写单例的,但是这样写有什么弊端呢?假如我们的Bike类需要和其它人的代码有交互,其它人在使用Bike类时,没有认真看你的Bike.h文件,直接用了[[Bike alloc] init];来生成实例,这时候与你当初设计Bike为单例的初衷相悖了.那要怎么解决这个问题呢?
在上述sharedBike方法中,生成Bike类的实例时,其它调用了alloc方法(new最后也要调用alloc方法),其它人在调用的时候也用了alloc方法,那么我们可不可以在alloc方法上做一下文章呢?答案是可以的.iOS中类调用alloc方法时,其它是调用了:
+ (instancetype)allocWithZone:(struct _NSZone *)zone;
这个方法,所以我们只需要在这个方法中做一下文章就可以了,代码如下:
#import "Bike.h"@implementation Bike+ (instancetype)sharedBike{ return [[self alloc] init];}+ (instancetype)allocWithZone:(struct _NSZone *)zone{ static Bike *bike; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ bike = [super allocWithZone:zone]; }); return bike;}@end
上述代码即能保证通过sharedBike和[[Bike alloc] init]方法得到的类都是同一个类.到这一步是不是觉得这种写法就已经OK了?不,不,不,你有没有考虑过copy与mutable时还能保证得到的是仍然是同一个单例,上代码:
#import "Bike.h"@interface Bike ()<NSCopying, NSMutableCopying>@end@implementation Bikestatic Bike *bike;+ (instancetype)sharedBike{ return [[self alloc] init];}+ (instancetype)allocWithZone:(struct _NSZone *)zone{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ bike = [super allocWithZone:zone]; }); return bike;}- (instancetype)copyWithZone:(NSZone *)zone{ return bike;}- (instancetype)mutableCopyWithZone:(NSZone *)zone{ return bike;}@end
说完单例的创建,我们说说单例的销毁.世间万物,有生必有死.假如我们自己创建的一些单例类,需要内嵌到别人的工程中,而且在别人的工程中只有某种场景下,才会调用我们的单例类,再或者我们的单例类有很多属性,有一个socket保持与后台的常连接等,总之就是比较耗资源,我们希望我们的类在其它工程中如果不用了就销毁掉,这样可以节省资源.
在上述单例的代码中有一个onceToken变量,在单例生成之前onceToken = 0,在单例生成之后onceToken = -1了,之后一直保持-1这个值,知道这个之后我想你应该有思路了,代码如下:
@implementation Bikestatic Bike *bike;static dispatch_once_t onceToken;- (void)destroySingleton{ bike = nil; onceToken = 0;}
- iOS单例的创建与销毁
- iOS单例销毁
- 一:类的创建和销毁__singleton单例模式
- 对象的创建与销毁
- session的创建与销毁
- 对象的创建与销毁
- iOS 单列的创建和销毁
- 非模态对话框的创建与销毁
- APR内存池的创建与销毁
- Montouch多视图的创建与销毁
- 非模态对话框的创建与销毁
- android线程的创建与销毁
- 非模态对话框的创建与销毁
- Android线程的创建与销毁
- Android线程的创建与销毁
- Android线程的创建与销毁
- linux内核线程的创建与销毁
- linux内核线程的创建与销毁
- UnityShader实例04:遮挡透明材质
- 书单
- Qt-问题总汇
- 如何利用PDF文件中的其中一页
- JMeter:生成漂亮的多维度的HTML报告
- iOS单例的创建与销毁
- java CSDN转载博客的方法
- 调用相机或相册上传图片到服务器
- hdu 6181 Two Paths (多校第十场)
- pinyin4j使用示例(支持多音字)
- linux批量更改文件所有者
- Python多进程
- Monkey详解(脚本篇---获取坐标)
- Python网络编程示例