iOS最新面試題匯總:
iOS最新面試題匯總(一)
iOS最新面試題匯總(二)
iOS最新面試題匯總(三)
iOS最新面試題匯總(四)
-
Objective-C 中創(chuàng)建線程的方法是什么庵楷?如果在主線程中執(zhí)行代碼罢艾,方法是什么?如果想延時執(zhí)行代碼尽纽、方法又是什么咐蚯?
答:線程創(chuàng)建有三種方法:使用NSThread創(chuàng)建、使用GCD的dispatch弄贿、使用子類化的NSOperation,然后將其加入NSOperationQueue;在主線程執(zhí)行代碼春锋,方法是performSelectorOnMainThread,如果想延時執(zhí)行代碼可以用performSelector:onThread:withObject:waitUntilDone:
-
Category(類別)差凹、 Extension(擴展)和繼承的區(qū)別
區(qū)別:
- 分類有名字期奔,類擴展沒有分類名字,是一種特殊的分類直奋。
- 分類只能擴展方法(屬性僅僅是聲明,并沒真正實現(xiàn))施禾,類擴展可以擴展屬性脚线、成員變量和方法。
- 繼承可以增加弥搞,修改或者刪除方法邮绿,并且可以增加屬性。
-
我們說的OC是動態(tài)運行時語言是什么意思攀例?
答:主要是將數(shù)據(jù)類型的確定由編譯時船逮,推遲到了運行時。簡單來說, 運行時機制使我們直到運行時才去決定一個對象的類別,以及調(diào)用該類別對象指定方法粤铭。
-
為什么我們常見的delegate屬性都用是weak而不是retain/strong挖胃?
答:是為了防止delegate兩端產(chǎn)生不必要的循環(huán)引用。
@property (nonatomic, weak) id<UITableViewDelegate> delegate;
-
什么時候用delegate梆惯,什么時候用Notification酱鸭?
Delegate(委托模式):1對1的反向消息通知功能。
Notification(通知模式):只想要把消息發(fā)送出去垛吗,告知某些狀態(tài)的變化凹髓。但是并不關(guān)心誰想要知道這個。
-
什么是 KVO 和 KVC怯屉?
1). KVC(Key-Value-Coding):鍵值編碼 是一種通過字符串間接訪問對象的方式(即給屬性賦值)
舉例說明:
stu.name = @"張三" // 點語法給屬性賦值
[stu setValue:@"張三" forKey:@"name"]; // 通過字符串使用KVC方式給屬性賦值
stu1.nameLabel.text = @"張三";
[stu1 setValue:@"張三" forKey:@"nameLabel.text"]; // 跨層賦值
2). KVO(key-Value-Observing):鍵值觀察機制 他提供了觀察某一屬性變化的方法蔚舀,極大的簡化了代碼饵沧。
KVO只能被KVC觸發(fā),包括使用setValue:forKey:方法和點語法赌躺。
// 通過下方方法為屬性添加KVO觀察
-(void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;
// 當(dāng)被觀察的屬性發(fā)送變化時狼牺,會自動觸發(fā)下方方法(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{}
KVC 和 KVO 的 keyPath 可以是屬性、實例變量寿谴、成員變量锁右。-
KVC的底層實現(xiàn)?
當(dāng)一個對象調(diào)用setValue方法時讶泰,方法內(nèi)部會做以下操作:
1). 檢查是否存在相應(yīng)的key的set方法咏瑟,如果存在,就調(diào)用set方法痪署。
2). 如果set方法不存在码泞,就會查找與key相同名稱并且?guī)聞澗€的成員變量,如果有狼犯,則直接給成員變量屬性賦值余寥。
3). 如果沒有找到_key,就會查找相同名稱的屬性key悯森,如果有就直接賦值宋舷。
4). 如果還沒有找到,則調(diào)用valueForUndefinedKey:和setValue:forUndefinedKey:方法瓢姻。
這些方法的默認(rèn)實現(xiàn)都是拋出異常祝蝠,我們可以根據(jù)需要重寫它們。
-
KVO的底層實現(xiàn)幻碱?
KVO基于runtime機制實現(xiàn)绎狭。
-
ViewController生命周期
按照執(zhí)行順序排列:
1.initWithCoder:通過nib文件初始化時觸發(fā)。
2.awakeFromNib:nib文件被加載的時候褥傍,會發(fā)生一個awakeFromNib的消息到nib文件中的每個對象儡嘶。
3.loadView:開始加載視圖控制器自帶的view。
4.viewDidLoad:視圖控制器的view被加載完成恍风。
5.viewWillAppear:視圖控制器的view將要顯示在window上蹦狂。
6.updateViewConstraints:視圖控制器的view開始更新AutoLayout約束。
7.viewWillLayoutSubviews:視圖控制器的view將要更新內(nèi)容視圖的位置朋贬。
8.viewDidLayoutSubviews:視圖控制器的view已經(jīng)更新視圖的位置鸥咖。
9.viewDidAppear:視圖控制器的view已經(jīng)展示到window上。
10.viewWillDisappear:視圖控制器的view將要從window上消失兄世。
11.viewDidDisappear:視圖控制器的view已經(jīng)從window上消失啼辣。
-
方法和選擇器有何不同?
selector是一個方法的名字御滩,方法是一個組合體鸥拧,包含了名字和實現(xiàn)党远。
-
你是否接觸過OC中的反射機制?簡單聊一下概念和使用
1). class反射
通過類名的字符串形式實例化對象富弦。
Class class = NSClassFromString(@"student");
Student *stu = [[class alloc] init];
將類名變?yōu)樽址?br> Class class =[Student class];
NSString className = NSStringFromClass(class);
2). SEL的反射
通過方法的字符串形式實例化方法沟娱。
SEL selector = NSSelectorFromString(@"setName");
[stu performSelector:selector withObject:@"Mike"];
將方法變成字符串。
NSStringFromSelector(@selector(setName:));
-
調(diào)用方法有兩種方式:
1). 直接通過方法名來調(diào)用腕柜。[person show];
2). 間接的通過SEL數(shù)據(jù)來調(diào)用 SEL aaa = @selector(show); [person performSelector:aaa];
-
如何對iOS設(shè)備進行性能測試济似?
答: Profile-> Instruments ->Time Profiler
-
開發(fā)項目時你是怎么檢查內(nèi)存泄露?
1). 靜態(tài)分析 analyze盏缤。
2). instruments工具里面有個leak可以動態(tài)分析砰蠢。
-
什么是懶加載?
答:懶加載就是只在用到的時候才去初始化唉铜。也可以理解成延時加載台舱。
我覺得最好也最簡單的一個例子就是tableView中圖片的加載顯示了, 一個延時加載, 避免內(nèi)存過高,一個異步加載,避免線程堵塞提高用戶體驗。
-
類變量的 @public潭流,@protected竞惋,@private,@package 聲明各有什么含義灰嫉?
@public 任何地方都能訪問;
@protected 該類和子類中訪問,是默認(rèn)的;
@private 只能在本類中訪問;
@package 本包內(nèi)使用,跨包不可以拆宛。
-
什么是謂詞?
謂詞就是通過NSPredicate給定的邏輯條件作為約束條件,完成對數(shù)據(jù)的篩選讼撒。
//定義謂詞對象,謂詞對象中包含了過濾條件(過濾條件比較多)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age<%d",30];
//使用謂詞條件過濾數(shù)組中的元素,過濾之后返回查詢的結(jié)果
NSArray *array = [persons filteredArrayUsingPredicate:predicate];
-
isa指針問題
isa:是一個Class 類型的指針. 每個實例對象有個isa的指針,他指向?qū)ο蟮念?而Class里也有個isa的指針, 指向meteClass(元類)浑厚。元類保存了類方法的列表。當(dāng)類方法被調(diào) 用時,先會從本身查找類方法的實現(xiàn),如果沒有,元類會向他父類查找該方法椿肩。同時注意的是:元類(meteClass)也是類,它也是對象瞻颂。元類也有isa指針,它的isa指針最終指向的是一個根元類(root meteClass)豺谈。根元類的isa指針指向本身,這樣形成了一個封閉的內(nèi)循環(huán)郑象。
-
如何訪問并修改一個類的私有屬性?
1). 一種是通過KVC獲取茬末。
2). 通過runtime訪問并修改私有屬性厂榛。
-
一個objc對象的isa的指針指向什么?有什么作用丽惭?
答:指向他的類對象,從而可以找到對象上的方法击奶。
聯(lián)系
github地址:https://github.com/meetly
希望大家多多指教!