iOS基础知识点

75 阅读2分钟

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 的概念,元类中保存了创建类对象以及类方法所需要的信息

对象方法和类方法的区别?
  • 对象方法能个访问成员变量。
  • 类方法中不能直接调用对象方法,想要调用对象方法,必须创建或者传入对象。
  • 类方法可以和对象方法重名。