【2018最新】iOS面試題(二)
1.VC的生命週期
init:初始化程式
loadView:檢視初始化
viewDidLoad:檢視載入完成
viewWillAppear:檢視即將顯示
viewDidAppear:檢視顯示時呼叫
viewWillDisappear:檢視即將消失
viewDidDisappear:檢視消失時呼叫
2.assign 和weak的區別
weak所有權修飾符表明該屬性定義了一種非擁有關係,為這種屬性設定新值時,既不保留新值,也不釋放舊值。weak修飾的屬性所指向的物件銷燬以後,屬性會自動置為nil,assign的特質與weak類似,但是assign修飾的屬性所指向的物件銷燬以後,不會自動置為nil。
assign可以修飾非OC物件,weak只能用來修飾OC物件。
3.氣泡排序的時間複雜度
氣泡排序:
NSMutableArray *arrs = [NSMutableArray arrayWithObjects:@"17",@"23",@"11",@"47", nil];
for (int i = 0; i < arrs.count-1; i++) {
for (int j = 0; j < arrs.count-1-i; j++) {
if ([arrs[j] intValue] > [arrs[j+1] intValue]) {
int tmp = [arrs[j] intValue];
arrs[j] = arrs[j+1 ];
arrs[j+1] = [NSString stringWithFormat:@"%d",tmp];
}
}
}
氣泡排序時間複雜度:O(n^2) —O(n的2次方)
氣泡排序空間複雜度:O(1)
時間複雜度:執行這個演算法需要消耗的時間
①用常數1代替演算法中的所有加法常數
sum = n*(n+1)/2;
該演算法的時間複雜度為O(1)
②修改後的執行次數中只保留最高階項
for (int i = 1; i < n; i++) {
x += i;
}
for (int i = 1; i < n; i ++) {
for (int j = 1; j < n; j++) {
x += i+j;
}
}
第一個for迴圈的時間複雜度為O(n),第二個for迴圈的時間複雜度為O(n^2),整個演算法的時間複雜度為O(n)+O(n^2)=O(n^2)。
③去除最高階項的係數
for (int i = 1; i < 3n; i++) {
for (int j = 1; j < n; j++) {
x += i+j;
}
}
O(3n*n)=O(n^2)
④指數階
int i = 1,n = 100;
while (i<n) {
i = i*2;
}
該演算法的執行次數為x, 2^x = n,x = log2n,時間複雜度為O(log2n)
空間複雜度:執行演算法需要佔用的記憶體空間
當一個演算法的空間複雜度為一個常量,即不隨被處理資料量n的大小而改變時,可表示為O(1);當一個演算法的空間複雜度與以2為底的n的對數成正比時,可表示為O(10g2n);當一個演算法的空I司複雜度與n成線性比例關係時,可表示為O(n)
4.static和define的區別
define定義的常量沒有型別,static定義的常量有型別,在定義常量的時候,儘量使用static+const的方式
5.視訊用的基礎框架
本地和網路流媒體音訊視訊播放:AVFoundation、MediaPlayer
VLC框架本地和網路流媒體音訊視訊播放:MobileVLCKit、
6.afn底層原理
AFN是對蘋果的NSURLSession網路框架進行的封裝,AFN分為六個部分:
①通過AFSecurityPolicy實現安全策略,AFSecurityPolicy提供了三個安全策略,分別為無校驗、公鑰校驗、證書校驗
②AFNetworkReachabilityManager提供了四種列舉型別,實現對當前網路狀態的判斷,分別為未知網路、斷網、流量、wifi,當網路狀態發生變化時,通過block進行回撥
③通過AFURLRequestSerialization將資料傳送給伺服器,AFURLRequestSerialization中我們經常用到的有三個部分:AFURLRequestSerialization協議返回一個序列化請求;AFHTTPRequestSerializer初始化請求類、對序列化引數編碼、建立請求快取策略、進行超時設定等;AFJSONRequestSerializer用來處理json型別請求
④通過AFURLResponseSerialization實現對伺服器響應的處理,AFURLResponseSerialization中我們經常用到的有五個部分:AFURLResponseerialization協議返回一個序列化響應;AFHTTPResponseSerializer初始化響應類、設定可接收的Content-Type型別;AFJSONResponseSerializer校驗並解碼json型別的響應;AFXMLParserResponseSerializer校驗並解碼xml型別的響應;AFImageResponseSerializer校驗並解碼UIImage型別的響應。
⑤通過AFURLSessionManager建立不同型別的網路請求會話、設定網路請求的迴響
⑥AFHTTPSessionManager根據不同需求,建立所需的GET、HEAD、POST、PUT、PATCH、DELETE方法
7.sd快取原理
(今天公司組織去看厲害了我的國紀錄片,明天再發,好久不看了,還得現看一下)
8.簡單說一下連結串列
連結串列中的元素在記憶體中不是連續放置的,連結串列有不同的型別,分為單向連結串列和雙向連結串列。單向連結串列中一個節點只有鏈向下一個節點的連結,而在雙向連結串列中,連結是雙向的,一個鏈向下一個元素,另一個鏈向前一個元素。
9.KVC、KVO原理
KVO的原理:當觀察物件B時,KVO會通過OC的runtime動態建立一個物件B當前類的子類,併為這個新的子類重寫被觀察屬性的setter方法,setter方法隨後負責通知觀察物件屬性的改變狀況。KVO是通過setter方法實現的,需要使用self.來修改屬性物件的成員變數才會有效,直接通過成員變數賦值不會觸發KVO機制
KVC的原理:當一個物件呼叫setValue方法時,方法內部會做以下操作
①檢查是否存在相應的key的set方法,如果存在,就呼叫set方法
②如果set方法不存在,就會查詢與key相同並且帶下劃線的成員變數,如果有,則直接給成員變數屬性賦值
③如果沒有找到_key,就會查詢相同名稱的屬性key,如果有就直接賦值
④如果還沒有找到,則呼叫valueForUndefinedKey和setValue:forUndefinedKey方法
10.手寫單例
static XMSecureManager *shareManager;
static dispatch_once_t once;
dispatch_once(&once,^{
shareManager = [[self alloc] init];
});
return shareManager;