Objective-C 是苹果为 iOS 和 Mac 开发量身定制的语言。它随着 iPhone 的出现而大火,直到今天国内外大多数的 App 依然是用 Objective-C 在写。
Objective-C 一度在 TIOBE 排行榜上位列第 3 名,仅次于 Java 和 C。其市场占有份额也远超其他语言。看名字我们可以知道,它与 C 语言有千丝万缕的联系,事实上也确实如此:Objective-C 是 C 语言的超集,它在 C 语言主体上加上了面向对象的特性。这是为了 App 开发的方便,同时也兼顾了语言的整体性能。
现在的面试中,传统大厂如 BAT 对 Objective-C 的语言进行较多考察,日常开发也是以 Objective-C 为主。 本章将探讨 Objective-C 的基本语言特性,其动态特性将与 Swift 比较中设计。
Objective-C 面试理论题
1.什么是 ARC?
关键词:#内存管理
ARC全称是Automatic Reference Counting,是Objective-C和Swift的内存管理机制。它是根据对象的引用计数来判断当前对象的生命周期:当有一个新的指针指向这个对象时,我们将其引用计数加 1,当某个指针不再指向这个对象时,我们将其引用计数减 1,当对象的引用计数变为 0 时,说明这个对象不再被任何指针指向了,这个时候我们就可以将对象销毁,回收内存。
简单地来说,就是代码中自动加入了 retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。
ARC 的使用是为了解决对象 retain 和 release 匹配的问题。以前手动管理造成内存泄漏或者重复释放的问题将不复存在。
加分回答:
以前需要手动的通过 retain 去为对象获取内存,并用 release 释放内存。所以以前的操作称为 MRC (Manual Reference Counting)。
ARC 与 Garbage Collection 的区别在于 Garbage Collection 在 runtime 时管理内存,可以解决 retain cycle,而 ARC 在 compile time 时管理内存。
类似问题:
Objective-C 的内存管理机制是什么?
2.什么情况下会出现循环引用?
关键词:#内存管理
循环引用是指 2 个或以上对象互相强引用,导致所有对象无法释放的现象。这是内存泄漏的一种情况。举个例子:
=== class Father ===
@interface Father: NSObject
@property (strong, nonatomic) Son *son;
@end
=== class Son ===
@interface Son: NSObject
@property (strong, nonatomic) Father *father;
@end
上述代码有两个类,分别为爸爸和儿子。爸爸对儿子强引用,儿子对爸爸强引用。这样释放儿子必须先释放爸爸,要释放爸爸必须先释放儿子。如此一来,两个对象都无法释放。
解决方法是将 Father 中的 Son 对象属性从 strong 改为 weak。
加分回答:
内存泄漏可以用 Xcode 中的 Debug Memory Graph 去检查:
同时 Xcode 也会在 runtime 中自动汇报内存泄漏的问题: