iOS大神班笔记02-模仿苹果创建单例
首先我们得要知道苹果是如何实现单例的:1.不能外界调用alloc,一调用就崩掉,其实就是抛异常(类内部第一次调用alloc就不崩溃,其他都崩溃)。
2.提供一个方法给外界获取单例。
3.内部创建一次单例,什么时候创建,程序启动的时候创建单例。
然后我们来创建一个Person类。
Person.h #import <Foundation/Foundation.h> @interface Person : NSObject // 获取单例 + (instancetype)sharePerson; @end
Person.m #import "Person.h" @implementation Person // 程序启动时候创建对象 // 静态变量 static Person *_instance = nil; // 作用:加载类 // 什么调用:每次程序一启动,就会把所有的类加载进内存 + (void)load { NSLog(@"%s",__func__); _instance = [[self alloc] init]; } + (instancetype)sharePerson { return _instance; } + (instancetype)alloc { if (_instance) { // 标示已经分配好了,就不允许外界在分配内存 // 抛异常,告诉外界不运用分配 // 'NSInternalInconsistencyException', reason: 'There can only be one UIApplication instance.' // 创建异常类 // name:异常的名称 // reson:异常的原因 // userInfo:异常的信息 NSException *excp = [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one Person instance." userInfo:nil]; // 抛异常 [excp raise]; } // super -> NSObject 才知道怎么分配内存 // 调用系统默认的做法, 当重写一个方法的时候,如果不想要覆盖原来的实现,就调用super return [super alloc]; }
在这里我只是想模拟下苹果底层是如何实现单例的,我们一般情况下并不会使用这种方法。我们一般会使用如下方法:
+(instancetype)sharedPerson { // 静态变量 static Person *_instance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[self alloc]init]; }); return _instance; }
如果我的内容能对你有所帮助,我就很开心啦!