1. weak和assgin的区别?
共同点: weak和assgin都不会增加对象的引用计数
区别:weak只能修饰对象,assgin可以修饰对象和基本数据类型
assgin修饰对象会造成野指针,weak修饰对象会把对象的指针指向 nil
延伸: 代理可以用assgin修饰吗?编译报错吗??
编译不会报错,会造成野指针
2. weak实现的原理 ; 当引用对象销毁 他是如何管理内部的hash表的
weak是如何实现的?
runtime会把weak修饰的对象放到一个全局的哈希表中,weak修饰对象的内存地址作为key , value是weak指针的地址数组,在对象进行销毁时,通过自身地址去哈希表中查找到所有指向此对象的weak指针数组,并遍历数组,把所有weak指针置为nil
如何管理的?
创建一个全局的SideTables 管理所有对象的引用计数和weak指针
SideTable的结构
struct SideTable {
spinlock_t slock; *//保证原子操作的自旋锁*
RefcountMap refcnts;*//保存引用计数的散列表*
weak_table_t weak_table; *//保存weak引用的全局散列表*
}
3. 讲一下对象,类对象,元类,跟元类结构体的组成以及他们是如何相关联的? 对象的结构体里面存放isa和成员变量,isa指向类对象, 类对象的isa指向元类,元类的isa指向NSObject的元类 类对象和元类对象的结构体都有isa superclass bits cache
为什么对象的方法保存在类对象中?
方法是每个对象可以互相共用的,如果每个对象都存储一份方法列表太浪费内存,由于对象的isa是指向类对象的,当调用的时候,直接去类对象中查找就可以了,节约很多内存空间
为什么要有元类存在?
因为类本身也是一个对象,我们可以向这个对象发送消息,即调用类方法,为了调用类方法,这个类的isa指针必须指向一个包含这些类方法的一个objc_class结构体,这就引出了meta-class 的概念,元类中保存了创建类对象以及类方法所需要的信息
对象方法和类方法的区别?
- 对象方法能个访问成员变量。
- 类方法中不能直接调用对象方法,想要调用对象方法,必须创建或者传入对象。
- 类方法可以和对象方法重名。