iOS基础知识3

来源:互联网 发布:服装店记账软件手机 编辑:程序博客网 时间:2024/06/06 02:25

一、Runtime如何通过selector找到对应的IMP地址?(分别考虑类方法和实例方法)

每一个类对象中都一个方法列表,方法列表中记录着方法的名称、方法实现、以及参数类型,其实selector本质就是方法名称,通过这个方法名称就可以在方法列表中找到对应的方法实现。




二、使用Runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么?

objc_setAssociatedObject(self, @selector(associatedObject), object, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
最后这个参数有如下几个:

OBJC_ASSOCIATION_ASSIGNOBJC_ASSOCIATION_RETAIN_NONATOMICOBJC_ASSOCIATION_COPY_NONATOMICOBJC_ASSOCIATION_RETAINOBJC_ASSOCIATION_COPY
无论ARC或MRC,根据我们的具体需要设置,都不需要在主对象dealloc的时候释放。



三、objc中的类方法和实例方法有什么本质区别和联系?

类方法:

1、类方法是属于类对象

2、类方法只能通过类对象调用

3、类方法中的self是类对象

4、类方法可以调用其他的类方法

5、类方法中不能访问成员变量

6、类方法中不能直接调用对象方法

7、类方法是存储在元类对象的方法缓存中

实例方法:

1、实例方法是属于实例对象

2、实例方法只能通过实例对象调用

3、实例方法中的self是实例对象

4、实例方法中可以访问成员变量

5、实例方法中直接调用实例方法

6、实例方法中可以调用类方法(通过类名)

7、实例方法是存储在类对象的方法缓存中




四、_objc_msgForward函数是做什么的?直接调用它会发生什么?

_objc_msgForward是用于消息转发的,当向一个对象发送一条消息,这个对象并没有实现的时候,_objc_msgForward会尝试做消息转发。

直接调用_objc_msgForward很危险,如果用不好会导致程序crash,用的好很棒。

JSPatch就是直接调用_objc_msgForward来实现其核心功能




五、Runtime如何实现weak变量的自动置nil?

Runtime 对注册的类,会进行布局,对于weak对象会放入一个hash表中。 用weak指向的对象内存地址作为key,当此对象的引用计数为0的时候会dealloc,假如weak指向的对象内存地址是0xbbbb,那么就会以0xbbbb为键, 在这个weak表中搜索,找到所有以0xbbbb为键的weak对象,从而设置为 nil。
__unsafe_unretained: 不会对对象进行retain,当对象销毁时,会依然指向之前的内存空间(野指针),不置为nil。
__weak: 不会对对象进行retain,当对象销毁时,会自动指向nil。




六、能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么?
不能向编译后得到的类中增加实例变量。
可以向运行时创建的类中添加实例变量。

因为编译后的类已经注册在Runtime中,类结构体中的objc_ivar_list实例变量的链表和instance_size实例变量的内存大小已经确定,同时Runtime会调用class_setIvarLayout或class_setWeakIvarLayout来处理strong、weak引用,所以不能向存在的类中添加实例变量。

运行时创建的类是可以添加实例变量,调用 class_addIvar 函数。但是得在调用objc_allocateClassPair之后objc_registerClassPair之前,原因同上。

原创粉丝点击