iOS最新面試題匯總:
iOS最新面試題匯總(一)
iOS最新面試題匯總(二)
iOS最新面試題匯總(三)
iOS最新面試題匯總(四)
-
Objective-C 中創建線程的方法是什么?如果在主線程中執行代碼,方法是什么?如果想延時執行代碼、方法又是什么?
答:線程創建有三種方法:使用NSThread創建、使用GCD的dispatch、使用子類化的NSOperation,然后將其加入NSOperationQueue;在主線程執行代碼,方法是performSelectorOnMainThread,如果想延時執行代碼可以用performSelector:onThread:withObject:waitUntilDone:
-
Category(類別)、 Extension(擴展)和繼承的區別
區別:
- 分類有名字,類擴展沒有分類名字,是一種特殊的分類。
- 分類只能擴展方法(屬性僅僅是聲明,并沒真正實現),類擴展可以擴展屬性、成員變量和方法。
- 繼承可以增加,修改或者刪除方法,并且可以增加屬性。
-
我們說的OC是動態運行時語言是什么意思?
答:主要是將數據類型的確定由編譯時,推遲到了運行時。簡單來說, 運行時機制使我們直到運行時才去決定一個對象的類別,以及調用該類別對象指定方法。
-
為什么我們常見的delegate屬性都用是weak而不是retain/strong?
答:是為了防止delegate兩端產生不必要的循環引用。
@property (nonatomic, weak) id<UITableViewDelegate> delegate;
-
什么時候用delegate,什么時候用Notification?
Delegate(委托模式):1對1的反向消息通知功能。
Notification(通知模式):只想要把消息發送出去,告知某些狀態的變化。但是并不關心誰想要知道這個。
-
什么是 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觸發,包括使用setValue:forKey:方法和點語法。
// 通過下方方法為屬性添加KVO觀察
-(void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;
// 當被觀察的屬性發送變化時,會自動觸發下方方法(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{}
KVC 和 KVO 的 keyPath 可以是屬性、實例變量、成員變量。-
KVC的底層實現?
當一個對象調用setValue方法時,方法內部會做以下操作:
1). 檢查是否存在相應的key的set方法,如果存在,就調用set方法。
2). 如果set方法不存在,就會查找與key相同名稱并且帶下劃線的成員變量,如果有,則直接給成員變量屬性賦值。
3). 如果沒有找到_key,就會查找相同名稱的屬性key,如果有就直接賦值。
4). 如果還沒有找到,則調用valueForUndefinedKey:和setValue:forUndefinedKey:方法。
這些方法的默認實現都是拋出異常,我們可以根據需要重寫它們。
-
KVO的底層實現?
KVO基于runtime機制實現。
-
ViewController生命周期
按照執行順序排列:
1.initWithCoder:通過nib文件初始化時觸發。
2.awakeFromNib:nib文件被加載的時候,會發生一個awakeFromNib的消息到nib文件中的每個對象。
3.loadView:開始加載視圖控制器自帶的view。
4.viewDidLoad:視圖控制器的view被加載完成。
5.viewWillAppear:視圖控制器的view將要顯示在window上。
6.updateViewConstraints:視圖控制器的view開始更新AutoLayout約束。
7.viewWillLayoutSubviews:視圖控制器的view將要更新內容視圖的位置。
8.viewDidLayoutSubviews:視圖控制器的view已經更新視圖的位置。
9.viewDidAppear:視圖控制器的view已經展示到window上。
10.viewWillDisappear:視圖控制器的view將要從window上消失。
11.viewDidDisappear:視圖控制器的view已經從window上消失。
-
方法和選擇器有何不同?
selector是一個方法的名字,方法是一個組合體,包含了名字和實現。
-
你是否接觸過OC中的反射機制?簡單聊一下概念和使用
1). class反射
通過類名的字符串形式實例化對象。
Class class = NSClassFromString(@"student");
Student *stu = [[class alloc] init];
將類名變為字符串。
Class class =[Student class];
NSString className = NSStringFromClass(class);
2). SEL的反射
通過方法的字符串形式實例化方法。
SEL selector = NSSelectorFromString(@"setName");
[stu performSelector:selector withObject:@"Mike"];
將方法變成字符串。
NSStringFromSelector(@selector(setName:));
-
調用方法有兩種方式:
1). 直接通過方法名來調用。[person show];
2). 間接的通過SEL數據來調用 SEL aaa = @selector(show); [person performSelector:aaa];
-
如何對iOS設備進行性能測試?
答: Profile-> Instruments ->Time Profiler
-
開發項目時你是怎么檢查內存泄露?
1). 靜態分析 analyze。
2). instruments工具里面有個leak可以動態分析。
-
什么是懶加載?
答:懶加載就是只在用到的時候才去初始化。也可以理解成延時加載。
我覺得最好也最簡單的一個例子就是tableView中圖片的加載顯示了, 一個延時加載, 避免內存過高,一個異步加載,避免線程堵塞提高用戶體驗。
-
類變量的 @public,@protected,@private,@package 聲明各有什么含義?
@public 任何地方都能訪問;
@protected 該類和子類中訪問,是默認的;
@private 只能在本類中訪問;
@package 本包內使用,跨包不可以。
-
什么是謂詞?
謂詞就是通過NSPredicate給定的邏輯條件作為約束條件,完成對數據的篩選。
//定義謂詞對象,謂詞對象中包含了過濾條件(過濾條件比較多)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age<%d",30];
//使用謂詞條件過濾數組中的元素,過濾之后返回查詢的結果
NSArray *array = [persons filteredArrayUsingPredicate:predicate];
-
isa指針問題
isa:是一個Class 類型的指針. 每個實例對象有個isa的指針,他指向對象的類,而Class里也有個isa的指針, 指向meteClass(元類)。元類保存了類方法的列表。當類方法被調 用時,先會從本身查找類方法的實現,如果沒有,元類會向他父類查找該方法。同時注意的是:元類(meteClass)也是類,它也是對象。元類也有isa指針,它的isa指針最終指向的是一個根元類(root meteClass)。根元類的isa指針指向本身,這樣形成了一個封閉的內循環。
-
如何訪問并修改一個類的私有屬性?
1). 一種是通過KVC獲取。
2). 通過runtime訪問并修改私有屬性。
-
一個objc對象的isa的指針指向什么?有什么作用?
答:指向他的類對象,從而可以找到對象上的方法。
聯系
github地址:https://github.com/meetly
希望大家多多指教!