iOS大神班笔记02-模仿苹果创建单例

it2022-05-08  9

首先我们得要知道苹果是如何实现单例的: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; }

 

转载于:https://www.cnblogs.com/ming1025/p/6761053.html

相关资源:数据结构—成绩单生成器

最新回复(0)