Oc对象的isa的指针指向什么。啥作用。
指向它的类对象,可以找到对象的方法
一个nsobject对象占用多少内存空间:
在64位的环境下占8个字节,在32位环境上占4个字节
isa指针:
实例对象isa指向类对象
类对象isa指向元类对象
元类对象isa指向基类
黑魔法(method swizzling)
本质:方法交换
怎么换:
selector 方法名,imp函数指针,通过selector可以找到imp
发送消息报异常unrecognized selector :
通过isa指针找类和父类寻找方法。找不到 就进入消息转发阶段。还找不到就报错。安全做法将对象重新设置为nil,使其为空指针。
Student *stu = [[Student alloc] init];
[stu setAge:10];
[stu release];
stu = nil; // 关键
[stu setAge:10];
如何给分类添加属性, 关联对象以什么形式进行存储?
使用runtime. 关联对象以哈希表的格式存储在一个全局单例中。
类对象的数据结构?
类对象就是objc_class,继承objc_objc , 结构包含有(isa、缓存列表、父类指针、数据data)
runtime如何实现weak变量的自动置nil?知道sideTable?
Runtime对注册的类会进行内存布局,对于weak修饰的对象会放入hash哈希表中。通过键值对在weak表中查询,从而置为nil。
sideTable结构体负责管理表的。管理类的引用计数表和weak表。(key为对象的地址,value指针的地址)
Objc向一个nil对象发送消息会发生什么?:
Oc中向nil发消息,程序不会崩溃
分类编译后,是在什么时机与原有的类合并到一起的?:
编译后 初始化、重新方法化、会将方法列表、协议列表、原类合并 最后添加到class_rw_t结构体中
分类实现原理:
被添加到class_rw_t 结构体
_objc_msgForward:
用处:用于消息转发
分类的作用:
声明私有方法,分解体积大的开类文件,把framework的私有方法公
两个分类a和b,都有个同名的方法,哪个方法最终生效?
最后编译的那个分类的同名方法最终生效,之前会被覆盖掉。
扩展:
声明私有属性、声明私有成员变量,不能为系统类扩展
直接赋值成员变量会触发kvo么?:
不会。因为没有调setter方法
分类局限性:
分类的方法和类中的实现重命名,会覆盖原本方法的实现
多个分类的方法重名,会调用最后编译的那个分类的实现
分类的结构体里的成员:
实例方法列表、类方法列表、协议列表、属性列表