iOS開發在一般人眼里是簡單重復的代碼搬運工,是最底層的碼農;iOS或android都只是負責請求網絡參數,搭建界面而已。關鍵還是后臺的接口和系統的架構來支撐整個系統的穩定和發展。其實如果想開發出優秀的APP,成為真正的優秀的iOS開發者,就必須深入了解Objective-C語言和不斷地代碼優化,向優秀的人學習。這里我想通過整理大型公司的iOS面試題,幫助小伙伴們提升自己,并且進入優秀的公司和優秀的人一起工作。
面試題整理
百度面試題
1.1代碼規范考察
能夠有 10 處以上修改的就基本達到標準了。
1.2快速基礎考察
@property 后面可以有哪些修飾符?
什么情況使用 weak 關鍵字,相比 assign 有什么不同?
怎么用 copy 關鍵字?
這個寫法會出什么問題: @property (copy) NSMutableArray *array;
如何讓自己的類用 copy 修飾符?如何重寫帶 copy 關鍵字的 setter?
這一套問題區分度比較大,如果上面的問題都能回答正確,可以延伸問更深入點的:
@property 的本質是什么?ivar、getter、setter 是如何生成并添加到這個類中的
@protocol 和 category 中如何使用 @property
runtime 如何實現 weak 屬性
1.2能力等級考察題
[※]@property中有哪些屬性關鍵字?
[※]weak屬性需要在dealloc中置nil么?
[※※]@synthesize和@dynamic分別有什么作用?
[※※※]ARC下,不顯式指定任何屬性關鍵字時,默認的關鍵字都有哪些?
[※※※]用@property聲明的NSString
(或NSArray
,NSDictionary
)經常使用copy
關鍵字,為什么?如果改用strong
關鍵字,可能造成什么問題?
[※※※]@synthesize合成實例變量的規則是什么?假如property名為foo,存在一個名為_foo的實例變量,那么還會自動合成新變量么?
[※※※※※]在有了自動合成屬性實例變量之后,@synthesize還有哪些使用場景?
[※※]objc中向一個nil對象發送消息將會發生什么?
[※※※]objc中向一個對象發送消息[obj foo]
和objc_msgSend()
函數之間有什么關系?
[※※※]什么時候會報unrecognized selector
的異常?
[※※※※]一個objc對象如何進行內存布局?(考慮有父類的情況)
[※※※※]一個objc對象的isa
的指針指向什么?有什么作用?
[※※※※]下面的代碼輸出什么?
@implementation Son : Father
- (id)init
{
self = [super init];
if (self) {
NSLog(@"%@", NSStringFromClass([self class]));
NSLog(@"%@", NSStringFromClass([super class]));
}
return self;
}
@end
[※※※※]runtime如何通過selector找到對應的IMP地址?(分別考慮類方法和實例方法)
[※※※※]使用runtime Associate
方法關聯的對象,需要在主對象dealloc的時候釋放么?
[※※※※※]objc
中的類方法和實例方法有什么本質區別和聯系?
[※※※※※]_objc_msgForward
函數是做什么的,直接調用它將會發生什么?
[※※※※※]runtime
如何實現weak
變量的自動置nil?
[※※※※※]能否向編譯后得到的類中增加實例變量?能否向運行時創建的類中添加實例變量?為什么?
[※※※]runloop和線程有什么關系?
[※※※]runloop的mode作用是什么?
[※※※※]以+ scheduledTimerWithTimeInterval...
的方式觸發的timer,在滑動頁面上的列表時,timer會暫定回調,為什么?如何解決?
[※※※※※]猜想runloop內部是如何實現的?
[※]objc使用什么機制管理對象內存?
[※※※※]ARC通過什么方式幫助開發者管理內存?
[※※※※]不手動指定autoreleasepool
的前提下,一個autorealese對象在什么時刻釋放?(比如在一個vc的viewDidLoad中創建)
[※※※※]BAD_ACCESS在什么情況下出現?
[※※※※※]蘋果是如何實現autoreleasepool的?
[※※]使用block時什么情況會發生引用循環,如何解決?
[※※]在block內如何修改block外部變量?
[※※※]使用系統的某些block api(如UIView的block版本寫動畫時),是否也考慮引用循環問題?
[※※]GCD的隊列(dispatch_queue_t)分哪兩種類型?
[※※※※]如何用GCD同步若干個異步調用?(如根據若干個url異步加載多張圖片,然后在都下載完成后合成一張整圖)
[※※※※]dispatch_barrier_async的作用是什么?
[※※※※※]蘋果為什么要廢棄dispatch_get_current_queue?
[※※※※※]以下代碼運行結果如何?
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");
}
[※※]addObserver:forKeyPath:options:context:
各個參數的作用分別是什么,observer中需要實現哪個方法才能獲得KVO回調?
[※※※]如何手動觸發一個value的KVO
[※※※]若一個類有實例變量NSString *_foo
,調用setValue:forKey:
時,可以以foo還是_foo作為key?
[※※※※]KVC的keyPath中的集合運算符如何使用?
[※※※※]KVC和KVO的keyPath一定是屬性么?
[※※※※※]如何關閉默認的KVO的默認實現,并進入自定義的KVO實現?
[※※※※※]apple用什么方式實現對一個對象的KVO?
[※※]IBOutlet
連出來的視圖屬性為什么可以被設置成weak?
[※※※※※]IB中User Defined Runtime Attributes
如何使用?
[※※※]如何調試BAD_ACCESS錯誤
[※※※]lldb(gdb)常用的調試命令?
阿里面試題
阿里的面試題更側重于底層和數據結構,下面僅僅是iOS開發中用到的面試題
1:在KVO中,他是怎么知道監聽的對象發生了變化?
2:字典的工作原理 ?在100W個中是怎么快速去取value?
3:一個上線的項目,知道這個方法可能會出問題,在不破壞改方法前提下,怎么搞?
4:Block和函數指針的區別?
5 :說說你對 OC 中 `load `方法和` initialize` 方法的異同。——主要說一下執行時間,各自用途,沒實現子類的方法會不會調用父類的?
6 :說說你對 block 的理解。—— 三種 block,棧上的自動復制到堆上,block 的屬性修飾符是 copy,循環引用的原理和解決方案。
7 :說說你對 runtime 的理解。——主要是方法調用時如何查找緩存,如何找到方法,找不到方法時怎么轉發,對象的內存布局。
8 :說說你對 MVC 和 MVVM 的理解。—— MVC 的 C 太臃腫,可以和 V 合并,變成 MVVM 中的 V,而 VM 用來將 M 轉化成 V 能用的數據。
9 :說說 UITableView 的調優。——一方面是通過 instruments 檢查影響性能的地方,另一方面是估算高度并在 runloop 空閑時緩存。
10:談談你對 ARC 的理解。ARC 是編譯器完成的,依靠引用計數,談談幾個屬性修飾符的內存管理策略,什么情況下會內存泄露。
騰訊面試題
1: MVC 具有什么樣的優勢,各個模塊之間怎么通信,比如點擊 Button 后 怎么通知 Model?
2:兩個無限長度鏈表(也就是可能有環) 判斷有沒有交點
UITableView 的相關優化
3:KVO、Notification、delegate 各自的優缺點,效率還有使用場景
4:如何手動通知 KVO
5:Objective-C 中的 copy 方法
6:runtime 中,SEL 和 IMP 的區別
7:autoreleasepool 的使用場景和原理
8:RunLoop 的實現原理和數據結構,什么時候會用到
9:block 為什么會有循環引用
10:使用 GCD 如何實現這個需求:A、B、C 三個任務并發,完成后執行任務 D。
11:NSOperation 和 GCD 的區別
12:CoreData 的使用,如何處理多線程問題
13:如何設計圖片緩存?
14:有沒有自己設計過網絡控件?
15:怎么判斷某個 cell 是否顯示在屏幕上
16:進程和線程的區別
17:TCP 與 UDP 區別
18:TCP 流量控制
19:數組和鏈表的區別
20:UIView 生命周期
21:如果頁面 A 跳轉到 頁面 B,A 的 `viewDidDisappear` 方法和 B 的`viewDidAppear` 方法哪個先調用?
22:block 循環引用問題
23:ARC 的本質
24:RunLoop 的基本概念,它是怎么休眠的?
25:Autoreleasepool 什么時候釋放,在什么場景下使用?
26:如何找到字符串中第一個不重復的字符
27:哈希表如何處理沖突