博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC怎么正确的写单例
阅读量:4114 次
发布时间:2019-05-25

本文共 1400 字,大约阅读时间需要 4 分钟。

今天偶然看到一篇文章,有所感触,这才发现写了好久的单例竟然并没有写正确,研究了一下,总结如下:

@interface MySingle() 
@end@implementation MySingle+ (instancetype)sharedInstance { static MySingle *single = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"dispatch_once"); single = [[super allocWithZone:NULL] init]; // 下面代码进行当前类的初始化操作 [single initSelf]; }); NSLog(@"shared called"); return single;}// 初始化代码- (void)initSelf { self.myName = @"OK";}// 不能使用下面这个类进行初始化,否则会陷入死循环,或会使用得外部调用[[xx alloc] init] 会再次触发这个方法//- (instancetype)init {// NSLog(@"init called");// _myName = @"This is it.";// return self;//}+ (instancetype)allocWithZone:(struct _NSZone *)zone { NSLog(@"allocWithZone"); return [MySingle sharedInstance];}- (instancetype)copyWithZone:(NSZone *)zone { NSLog(@"copyWithZone"); return self;}- (instancetype)mutableCopyWithZone:(NSZone *)zone { NSLog(@"mutableCopyWithZone"); return self;}@end

使用时,下面几种方式都能访问到唯一的单例对象,且初始化方法也只会被调用一次,完美,收工。

MySingle *allIN = [[MySingle alloc] init];    NSLog(@"init:%@, name=%@", allIN, allIN.myName);        MySingle *the = [MySingle sharedInstance];        MySingle *copyIt = [the copy];    NSLog(@"c:%@, name=%@", copyIt, copyIt.myName);        NSLog(@"m:%@", [the mutableCopy]);

需要注意的是, 上面sharedInstance中写初始化时使用的是[super allocWithZone], 这里不能写成[self allocWithZone],否则会引发循环。

转载地址:http://tewpi.baihongyu.com/

你可能感兴趣的文章
编写代码模拟三次密码输入的场景。 最多能输入三次密码,密码正确,提示“登录成功”,密码错误,可以重新输入,最多输入三次。三次均错,则提示退出程序。
查看>>
C中的数组
查看>>
数组的练习
查看>>
小游戏——三子棋
查看>>
小游戏——扫雷
查看>>
数据在内存中的储存
查看>>
函数的调用过程
查看>>
可变参数列表解析
查看>>
冒泡排序
查看>>
模拟实现strstr
查看>>
模拟实现memcpy和memmove
查看>>
c语言中字符串函数的模拟实现
查看>>
高级指针1
查看>>
c中字符串模拟实现2
查看>>
qsort函数
查看>>
高级指针2
查看>>
指针与数组的总结
查看>>
自定义类型
查看>>
初识Linux
查看>>
网络基础思维导图
查看>>