内存管理
iOS 的内存管理方案有哪些?
RC:引用计数机制。采用引用计数来管理对象的内存,当需要持有一个对象时,使它的引用计数 +1;当不需要持有一个对象的时候,使它的引用计数 -1;当一个对象的引用计数为 0,该对象就会被销毁。
引用计数存储在哪里?以前存储在哪?现在呢?
32位:对象的引用计数都存储在一个叫SideTable结构体的RefCountMap(引用计数表)散列表中。
64位:存储在isa中,isa用nonpointer表示,变成了一个共用体(union)结构。
你能讲一下 super 的原理吗?
先大概解释一下self和super。self是对象指针,指向当前消息接收者。super是编译器指令,使用super调用方法是从当前消息接收者类的父类中开始查找方法的实现,但消息接收者还是子类。有关self和super的详细解释可以参阅
ARC 下没有 retain / release 等方法了吗?
CoreFoundation还是需要手动管理内存。ARC能够管理Objective-C对象的内存,却不能管理CF对象,CF对象依然需要我们手动管理内存。
Toll-Free Bridged 了解过吗?详细描述一下。
Core Foundation和Foundation框架的一些数据类型是可以相互转换的。这些可以相互转换的数据类型称为toll-free bridged数据类型。
所有权修饰符有哪些?
__strong:是默认修饰符。只要有强指针指向对象,对象就会保持存活。
__weak:指定一个不使引用对象保持存活的引用。当一个对象没有强引用时,弱引用weak会自动置为nil。
__unsafe_unretained:指定一个不使引用对象保持存活的引用,当一个对象没有强引用时,它不会置为nil。如果它引用的对象被销毁,就会产生悬垂指针。
__autoreleasing:用于表示通过引用(id *)传入,并在返回时(autorelease)自动释放的参数。
Tagged Pointer 是什么?
为了节省内存和提高执行效率,苹果在64bit程序中引入了Tagged Pointer技术,用于优化NSNumber、NSDate、NSString等小对象的存储。
在引入 Tagged Pointer 技术之前
NSNumber等对象存储在堆上,NSNumber的指针中存储的是堆中NSNumber对象的地址值。
在引入 Tagged Pointer 技术之后
NSNumber等对象的值直接存储在了指针中,不必在堆上为其分配内存,节省了很多内存开销。在性能上,有着 3 倍空间效率的提升以及 106 倍创建和销毁速度的提升。