iOS知识原理篇
runtime怎么添加属性、方法等
- ivar表示成员变量
- class_addIvar
- class_addMethod
- class_addProperty
- class_addProtocol
- class_replaceProperty
是否可以把比较耗时的操作放在NSNotificationCenter中
- 首先必须
明确通知在哪个线程中发出
,那么处理接受到通知的方法也在这个线程中调用 - 如果在
异步
线程发的通知,那么可以
执行比较耗时的操作; - 如果在
主线程
发的通知,那么就不可以
执行比较耗时的操作
runtime 如何实现 weak 属性
- 首先要搞清楚weak属性的特点
weak策略表明该属性定义了一种“非拥有关系” (nonowning relationship)。
为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似;
然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)
- 那么runtime如何实现weak变量的自动置nil?
runtime对注册的类,会进行布局,会将 weak 对象放入一个 hash 表中。
用 weak 指向的对象内存地址作为 key,当此对象的引用计数为0的时候会调用对象的 dealloc 方法,
假设 weak 指向的对象内存地址是a,那么就会以a为key,在这个 weak hash表中搜索,找到所有以a为key的 weak 对象,从而设置为 nil。
weak属性需要在dealloc中置nil么
- 在ARC环境无论是强指针还是弱指针都无需在 dealloc 设置为 nil , ARC 会自动帮我们处理
- 即便是编译器不帮我们做这些,weak也不需要在dealloc中置nil
- 在属性所指的对象遭到摧毁时,属性值也会清空
// 模拟下weak的setter方法,大致如下
- (void)setObject:(NSObject *)object
{
objc_setAssociatedObject(self, "object", object, OBJC_ASSOCIATION_ASSIGN);
[object cyl_runAtDealloc:^{
_object = nil;
}];
}
一个Objective-C对象如何进行内存布局?(考虑有父类的情况)
- 所有
父类的
成员变量和自己的
成员变量都会存放在该对象所对应的存储空间中 - 父类的方法和自己的方法都会缓存在类对象的方法缓存中,类方法是缓存在元类对象中
- 每一个对象内部都有一个
isa指针
,指向他的类对象
,类对象中存放着本对象的如下信息- 对象方法列表
- 成员变量的列表
- 属性列表
- 每个 Objective-C 对象都有相同的结构,如下图所示
Objective-C 对象的结构图 |
---|
ISA指针 |
根类(NSObject)的实例变量 |
倒数第二层父类的实例变量 |
... |
父类的实例变量 |
类的实例变量 |
- 根类对象就是NSObject,它的super class指针指向nil
- 类对象既然称为对象,那它也是一个实例。类对象中也有一个isa指针指向它的元类(meta class),即类对象是元类的实例。元类内部存放的是
类方法
列表,根元类的isa指针指向自己,superclass指针指向NSObject类
copyright © 2008-2019 亿联网络 版权所有 备案号:粤ICP备14031511号-2