iOS開發(fā)在一般人眼里是簡單重復(fù)的代碼搬運工驱入,是最底層的碼農(nóng)俐载;iOS或android都只是負(fù)責(zé)請求網(wǎng)絡(luò)參數(shù)多矮,搭建界面而已缓淹。關(guān)鍵還是后臺的接口和系統(tǒng)的架構(gòu)來支撐整個系統(tǒng)的穩(wěn)定和發(fā)展。其實如果想開發(fā)出優(yōu)秀的APP塔逃,成為真正的優(yōu)秀的iOS開發(fā)者讯壶,就必須深入了解Objective-C語言和不斷地代碼優(yōu)化,向優(yōu)秀的人學(xué)習(xí)湾盗。這里我想通過整理大型公司的iOS面試題伏蚊,幫助小伙伴們提升自己,并且進(jìn)入優(yōu)秀的公司和優(yōu)秀的人一起工作淹仑。
面試題整理
百度面試題
1.1代碼規(guī)范考察
能夠有 10 處以上修改的就基本達(dá)到標(biāo)準(zhǔn)了丙挽。
1.2快速基礎(chǔ)考察
@property 后面可以有哪些修飾符?
什么情況使用 weak 關(guān)鍵字匀借,相比 assign 有什么不同颜阐?
怎么用 copy 關(guān)鍵字?
這個寫法會出什么問題: @property (copy) NSMutableArray *array;
如何讓自己的類用 copy 修飾符吓肋?如何重寫帶 copy 關(guān)鍵字的 setter凳怨?
這一套問題區(qū)分度比較大,如果上面的問題都能回答正確,可以延伸問更深入點的:
@property 的本質(zhì)是什么肤舞?ivar紫新、getter、setter 是如何生成并添加到這個類中的
@protocol 和 category 中如何使用 @property
runtime 如何實現(xiàn) weak 屬性
1.2能力等級考察題
[※]@property中有哪些屬性關(guān)鍵字李剖?
[※]weak屬性需要在dealloc中置nil么芒率?
[※※]@synthesize和@dynamic分別有什么作用?
[※※※]ARC下篙顺,不顯式指定任何屬性關(guān)鍵字時偶芍,默認(rèn)的關(guān)鍵字都有哪些?
[※※※]用@property聲明的NSString
(或NSArray
德玫,NSDictionary
)經(jīng)常使用copy
關(guān)鍵字匪蟀,為什么?如果改用strong
關(guān)鍵字宰僧,可能造成什么問題材彪?
[※※※]@synthesize合成實例變量的規(guī)則是什么?假如property名為foo琴儿,存在一個名為_foo的實例變量段化,那么還會自動合成新變量么?
[※※※※※]在有了自動合成屬性實例變量之后造成,@synthesize還有哪些使用場景穗泵?
[※※]objc中向一個nil對象發(fā)送消息將會發(fā)生什么?
[※※※]objc中向一個對象發(fā)送消息[obj foo]
和objc_msgSend()
函數(shù)之間有什么關(guān)系谜疤?
[※※※]什么時候會報unrecognized selector
的異常?
[※※※※]一個objc對象如何進(jìn)行內(nèi)存布局现诀?(考慮有父類的情況)
[※※※※]一個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找到對應(yīng)的IMP地址坐桩?(分別考慮類方法和實例方法)
[※※※※]使用runtime Associate
方法關(guān)聯(lián)的對象,需要在主對象dealloc的時候釋放么封锉?
[※※※※※]objc
中的類方法和實例方法有什么本質(zhì)區(qū)別和聯(lián)系绵跷?
[※※※※※]_objc_msgForward
函數(shù)是做什么的,直接調(diào)用它將會發(fā)生什么成福?
[※※※※※]runtime
如何實現(xiàn)weak
變量的自動置nil碾局?
[※※※※※]能否向編譯后得到的類中增加實例變量?能否向運行時創(chuàng)建的類中添加實例變量奴艾?為什么净当?
[※※※]runloop和線程有什么關(guān)系?
[※※※]runloop的mode作用是什么?
[※※※※]以+ scheduledTimerWithTimeInterval...
的方式觸發(fā)的timer像啼,在滑動頁面上的列表時俘闯,timer會暫定回調(diào),為什么忽冻?如何解決真朗?
[※※※※※]猜想runloop內(nèi)部是如何實現(xiàn)的?
[※]objc使用什么機制管理對象內(nèi)存僧诚?
[※※※※]ARC通過什么方式幫助開發(fā)者管理內(nèi)存遮婶?
[※※※※]不手動指定autoreleasepool
的前提下,一個autorealese對象在什么時刻釋放振诬?(比如在一個vc的viewDidLoad中創(chuàng)建)
[※※※※]BAD_ACCESS在什么情況下出現(xiàn)蹭睡?
[※※※※※]蘋果是如何實現(xiàn)autoreleasepool的?
[※※]使用block時什么情況會發(fā)生引用循環(huán)赶么,如何解決肩豁?
[※※]在block內(nèi)如何修改block外部變量?
[※※※]使用系統(tǒng)的某些block api(如UIView的block版本寫動畫時)辫呻,是否也考慮引用循環(huán)問題清钥?
[※※]GCD的隊列(dispatch_queue_t)分哪兩種類型?
[※※※※]如何用GCD同步若干個異步調(diào)用放闺?(如根據(jù)若干個url異步加載多張圖片祟昭,然后在都下載完成后合成一張整圖)
[※※※※]dispatch_barrier_async的作用是什么?
[※※※※※]蘋果為什么要廢棄dispatch_get_current_queue怖侦?
[※※※※※]以下代碼運行結(jié)果如何篡悟?
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");
}
[※※]addObserver:forKeyPath:options:context:
各個參數(shù)的作用分別是什么,observer中需要實現(xiàn)哪個方法才能獲得KVO回調(diào)匾寝?
[※※※]如何手動觸發(fā)一個value的KVO
[※※※]若一個類有實例變量NSString *_foo
搬葬,調(diào)用setValue:forKey:
時,可以以foo還是_foo作為key艳悔?
[※※※※]KVC的keyPath中的集合運算符如何使用急凰?
[※※※※]KVC和KVO的keyPath一定是屬性么?
[※※※※※]如何關(guān)閉默認(rèn)的KVO的默認(rèn)實現(xiàn)猜年,并進(jìn)入自定義的KVO實現(xiàn)抡锈?
[※※※※※]apple用什么方式實現(xiàn)對一個對象的KVO?
[※※]IBOutlet
連出來的視圖屬性為什么可以被設(shè)置成weak?
[※※※※※]IB中User Defined Runtime Attributes
如何使用乔外?
[※※※]如何調(diào)試BAD_ACCESS錯誤
[※※※]lldb(gdb)常用的調(diào)試命令床三?
阿里面試題
阿里的面試題更側(cè)重于底層和數(shù)據(jù)結(jié)構(gòu),下面僅僅是iOS開發(fā)中用到的面試題
1:在KVO中杨幼,他是怎么知道監(jiān)聽的對象發(fā)生了變化勿璃?
2:字典的工作原理 ?在100W個中是怎么快速去取value?
3:一個上線的項目补疑,知道這個方法可能會出問題歧沪,在不破壞改方法前提下,怎么搞莲组?
4:Block和函數(shù)指針的區(qū)別诊胞?
5 :說說你對 OC 中 `load `方法和` initialize` 方法的異同∏妈荆——主要說一下執(zhí)行時間撵孤,各自用途,沒實現(xiàn)子類的方法會不會調(diào)用父類的竭望?
6 :說說你對 block 的理解邪码。—— 三種 block咬清,棧上的自動復(fù)制到堆上闭专,block 的屬性修飾符是 copy,循環(huán)引用的原理和解決方案旧烧。
7 :說說你對 runtime 的理解影钉。——主要是方法調(diào)用時如何查找緩存掘剪,如何找到方法平委,找不到方法時怎么轉(zhuǎn)發(fā)慨菱,對象的內(nèi)存布局施逾。
8 :說說你對 MVC 和 MVVM 的理解∑烀觯—— MVC 的 C 太臃腫匾鸥,可以和 V 合并昂勉,變成 MVVM 中的 V,而 VM 用來將 M 轉(zhuǎn)化成 V 能用的數(shù)據(jù)扫腺。
9 :說說 UITableView 的調(diào)優(yōu)〈逑螅——一方面是通過 instruments 檢查影響性能的地方笆环,另一方面是估算高度并在 runloop 空閑時緩存。
10:談?wù)勀銓?ARC 的理解厚者。ARC 是編譯器完成的躁劣,依靠引用計數(shù),談?wù)剮讉€屬性修飾符的內(nèi)存管理策略库菲,什么情況下會內(nèi)存泄露账忘。
騰訊面試題
1: MVC 具有什么樣的優(yōu)勢,各個模塊之間怎么通信,比如點擊 Button 后 怎么通知 Model鳖擒?
2:兩個無限長度鏈表(也就是可能有環(huán)) 判斷有沒有交點
UITableView 的相關(guān)優(yōu)化
3:KVO溉浙、Notification、delegate 各自的優(yōu)缺點蒋荚,效率還有使用場景
4:如何手動通知 KVO
5:Objective-C 中的 copy 方法
6:runtime 中戳稽,SEL 和 IMP 的區(qū)別
7:autoreleasepool 的使用場景和原理
8:RunLoop 的實現(xiàn)原理和數(shù)據(jù)結(jié)構(gòu),什么時候會用到
9:block 為什么會有循環(huán)引用
10:使用 GCD 如何實現(xiàn)這個需求:A期升、B惊奇、C 三個任務(wù)并發(fā),完成后執(zhí)行任務(wù) D播赁。
11:NSOperation 和 GCD 的區(qū)別
12:CoreData 的使用颂郎,如何處理多線程問題
13:如何設(shè)計圖片緩存?
14:有沒有自己設(shè)計過網(wǎng)絡(luò)控件容为?
15:怎么判斷某個 cell 是否顯示在屏幕上
16:進(jìn)程和線程的區(qū)別
17:TCP 與 UDP 區(qū)別
18:TCP 流量控制
19:數(shù)組和鏈表的區(qū)別
20:UIView 生命周期
21:如果頁面 A 跳轉(zhuǎn)到 頁面 B乓序,A 的 `viewDidDisappear` 方法和 B 的`viewDidAppear` 方法哪個先調(diào)用?
22:block 循環(huán)引用問題
23:ARC 的本質(zhì)
24:RunLoop 的基本概念舟奠,它是怎么休眠的竭缝?
25:Autoreleasepool 什么時候釋放,在什么場景下使用沼瘫?
26:如何找到字符串中第一個不重復(fù)的字符
27:哈希表如何處理沖突