1. 程式人生 > >【2018最新】iOS面試題(二)

【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;