用GCD写Objective-c的单例模式和C#有比较大的区别

声明h文件

#import <Foundation/Foundation.h>

@interface me : NSObject<NSObject>
@property (nonatomic) NSInteger age;
+(instancetype)makeme;
@end

instancetype和id的区别

instancetype返回的是该实例类型,而id返回的是未知类型

①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象,便于编写调试

②instancetype只能作为返回值,不能像id那样作为参数

具体原理是利用dispatch_once 来创建一个单实例,因为该函数在程序生命周期内只运行一次

void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);

第一个参数是检查后面第二个参数所代表的代码块是否被调用的谓词,第二个参数是在整个应用程序中只会被调用一次的代码块。

不过众多的dispath_once版本中我认为这个下面这个还不错

#import "me.h"
static me *myself;
@implementation me
+(id)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onetaken;
dispatch_once(&onetaken,^{
myself=[super allocWithZone:zone];
});
return myself;
}
+(instancetype)makeme{
static dispatch_once_t onetaken;
dispatch_once(&onetaken, ^{
myself=[[self alloc]init];
});
return myself;
}
-(id)copy{
return myself;
}

这里我们需要弄清楚allocWithZone方法。oc对象的初始化是alloc和init配合。alloc划分内存,init为实例配置参数变量,如对比下面代码,我删除了allocWithZone方法

#import "me.h"
static me *myself;
@implementation me
+(instancetype)makeme{
static dispatch_once_t onetaken;
dispatch_once(&onetaken, ^{
myself=[[self alloc]init];
});
return myself;
}

下面的例子是如果你如果用了

me *myself=[[me alloc]init];
me *myself1=[me makeme];

你会发现你获得了一个新的实例,。。。myself和myself1是不同的,这货不是单实例。。。当然因为我们用的alloc+init方法已经绕过了dispath_once的方法,单实例也就失效了

这意味着我们需要从实例初始化的地方开始

查看allocWithZone方法的介绍是

使用alloc方法初始化一个类的实例的时候,默认是调用了 allocWithZone 的方法。于是我们可以把这个也堵上就即使用户使用alloc +init 也不会产生新的实例。

最新文章

  1. Dog_Hybird的诞生
  2. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
  3. [原创]cocos2d-x研习录-第三阶 特性之触屏
  4. Python之Django--ORM连表操作
  5. Ajax基础实例
  6. sql server小技巧-自动添加时间与主键自增长
  7. python多线程ctrl-c退出问题
  8. CentOS6.4 安装JDK
  9. ☀【Node】处理文件上传
  10. C#_会员管理系统:开发五(用户注册)
  11. asyncio协议
  12. RDay2-Problem 1 A
  13. JVM学习三:静态分派
  14. leetcode 388.Lonest Absolute File Path
  15. Python3绘图库Matplotlib(02)
  16. [UE4]AWP狙击枪开镜
  17. .NetCore中使用AspectCore、ExceptionLess 实现AOP操作日志记录
  18. 【高德地图Android SDK】视频教学
  19. d-ary heap实现一个快速的优先级队列(C#)
  20. 1.Python是什么

热门文章

  1. IDEA 找不到maven编译命令操作
  2. 递归 recursive
  3. xcode7.1.1不能真机调试ios9.2系统设备的解决方法
  4. Shift Register
  5. 深入浅出--iOS的TCP/IP协议族剖析&amp;&amp;Socket
  6. JS DOM -- 关于回车键盘事件执行事件
  7. JQuery IN ACTION读书笔记之一: JQuery选择器
  8. knockout+weui+zepto
  9. UVA 1640 The Counting Problem UVA1640 求[a,b]或者[b,a]区间内0~9在里面各个数的数位上出现的总次数。
  10. mybatis执行多条sql语句