1、load和initialize方法的调用原则和调用顺序?
load方法是在应用程序加载过程中完成调用,在main函数之前调用,load的方法执行顺序大概是 父类>>子类>> Category。 并且如果子类没有实现load方法的话父类的load方法也不会被调用。
initialize方法是在第一次消息发送的时候调用,所以load方法先于initialize调用,会优先调用分类的initalize方法,子类没有实现initialize方法会调用父类的initialize方法
2、runtime是什么?
是由c和C++汇编实现的一套API,为C语言加入面向对象、运行时的功能,是指将数据类型的确定由编译时推迟到运行时
方法中的sel是什么?IMP是什么?两种之间的关系?
sel是方法编号~在read_images期间就编译进入内存
imp是函数指针地址
发送消息会有几个流程:
a、快速查找(objc_msgSend)~cache_t缓存消息
b、慢速查找~递归自己|父类~lookUpLmpOrForward
c、查找不到消息:动态方法解析~resolvelnstanceMethod
d、消息快速转发~forwardingTargetForSelector
e、消息慢速转发~methodSignatureForSelector & forwardinvocation
能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?
不能向编译后得到的类中增加实例变量,只要类没有注册到内存还是可以添加。原因:我们编译好的实例变量存储的位置在ro,一旦编译完成,内存结构就完全确定无法修改
[self class]和[super class]的区别以及原理分析?
[self class]就是发送消息objc_msgSend,消息接收者是self,方法编号是class
[super class]本质就是objc_msgSendSuper,消息的接收者还是self,方法编号:class
只是objc_msgSendSuper更快,跳过了self的查找
Runtime是如何实现weak的,为什么可以自动置nil?
1、通过SideTable找到weak_table
2、weak_table根据referent找到或者创建weak_entry_t
3、然后append_referrer(entry,referrer)将新弱引用的对象加进去entry
4、最后weak_entry_insert 把entry加入到weak_table
图(1)Runtime Asssociate方法关联对象,需要在dealloc中释放?
1、C++函数释放:object_cxxDestruct
2、移除关联属性:_object_remove_assocations
3、将弱引用自动设置nil:weak_clear_no_lock(&table.weak_table,(id)this);
4、引用计数处理:table.refcnts.erase(this);
5、销毁对象:free(obj)
网友评论