UIApplication - 02模拟单例
2020-08-08 本文已影响0人
js_huh
- 模仿
UIApplication单例 - 实现过程
, 要求如下:- 程序一启动就创建好了对象.
- 只能获取对象,且获取的对象地址都是同一个!
- 不能够进行
alloc
操作,当执行alloc时, 程序发生崩溃.
思路
- 在哪里创建对象,程序一启动就会创建好呢?
- 当类被加载到内存的时候,就会调用
load
方法。
load 方法
比main 方法
更早调用。 - 在
load
方法中创建的对象,出了load
方法,就销毁了。
那么,怎么保存load
方法中创建的对象呢 ?- 用成员属性来保存,可以吗? ❌ 会报错
-
语法 : 成员属性,不能在类方法访问
+ load
是类方法,所以出现以下提示:
-
错误提示:
Instance variable '_per' accessed in class method
成员属性,在类方法中被访问!
-
- 用静态的变量来保存,
load
里面创建对象。✔️
- 用成员属性来保存,可以吗? ❌ 会报错
- 当类被加载到内存的时候,就会调用
- 只能获取对象,且获取的对象地址都是相同得!
static Person *_pers; + (instancetype)sharedPerson{ return _pers; }
- 不能够进行
alloc
操作,当执行alloc时
, 程序发生崩溃.- 对象在
load 方法
的时候,就创建了。 - 想让系统的
alloc 方法
失效,只需要重写下自己的alloc 方法
即可。- 当对象有值时,直接抛出异常.
- 没有值时,调用父类的
alloc 方法
,(原本系统的alloc 方法
)
+ (instancetype)alloc{ if(_pers){ -- 对象有值时 -- 创建 NSException对象 NSException *exception= [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one Person instance" userInfo:nil]; -- 抛出异常 [exception raise]; } return [super alloc]; -- 调用系统的alloc方法 }
- 对象在