iOS(OC)面試小整理

1.OOP 編程思想

Object Oriented Programming(面向對象編程) 這種思想把一切看爲對象,把現實中的事物及關係抽象成對象,使咱們將處理現實中的實際問題簡化爲處理各類對象之間的問題面試

面向對象的三大特性sql

  • 封裝:如 屬性對成員變量的封裝,方法對功能的封裝,類對屬性及方法的封裝,提升複用性和安全性
  • 繼承:如 子類繼承父類,提升代碼複用性
  • 多態:父類指針指向子類對象,多種表現形態,提升程序的拓展性

2.SOLID 設計原則

  • S: Single responsibility(單一職責) 一個類只負責一件事情 如:蘋果設計 UIView 與 CALayer 就體現了這一原則,UIView 負責參與響應鏈、處理事件;CALayer 負責內容顯示、動畫
  • O:Open Closed(開閉) 對擴展開放,對修改關閉
  • L:Liskov substitute(里氏替換) 只要父類出現的地方子類就能夠將之替換
  • I:Interface Segregation(接口隔離) 使用多個專門的協議而不是一個龐大臃腫的協議且協議內聲明的方法儘可能少 如:UITableViewDataSource、UITableViewDelegate 設計了兩個接口
  • D:Dependency Inversion(依賴倒置) 抽象不該該依賴於具體實現,具體實現應該依賴於抽象 如:抽象父類定義了增刪改查接口,至於後面是本地的仍是遠程的增刪改查,是 sqlite3 仍是 coredata 的增刪改查,抽象父類不關心

3.屬性關鍵字

  • 讀寫屬性 readonly readwrite(默認)
  • 原子性 atomic(默認) nonatomic
  • 內存管理語義 assign(默認) strong weak copy
  • nonnull 不能爲空 nullable 能夠爲空 也能夠修飾方法參數,方法返回值

4.深拷貝、淺拷貝

  • 深拷貝:內容相同的、新的 內存空間,新的指針
  • 淺拷貝:拷貝的是指針
  • 不可變對象的 copy 爲淺拷貝,mutableCopy 爲深拷貝
  • 可變對象的 copy 和 mutableCopy 均爲深拷貝

Q:NSString 爲何用 copy 修飾?用 strong 會有問題麼?編程

A:保證其安全性設計模式

由於若是用 strong 修飾,在進行 setter 時,傳進來的是一個NSMutableString 也是能夠賦值的(這裏也有多態的體現),可是若是 NSMutableString 發生變化的話,因爲是 strong 修飾, NSString 的那個對象也會發生變化且無感知,這種風險就存在了,而若是用 copy 修飾,在 setter 時,若是傳進來的不可變對象 NSString,那麼 copy 爲淺拷貝,若是傳進來的是可變對象 NSMutableString,那麼 copy 爲深拷貝且 copy 出來的這個新對象變爲了避免可變的對象緩存

5.事件傳遞 & 響應鏈

事件傳遞:當一個事件產生好比說一個點擊事件,首先就要尋找最佳響應者,配合下面這兩個方法,找到最佳響應者以後,UIApplication發送事件給UIWindow,UIWindow發送事件給最佳響應者安全

- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;   // recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system - (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event; // default returns YES if point is in bounds 複製代碼

響應鏈:若是最佳響應者能夠處理這個事件,那就響應結束,若是不能響應事件則經過 nextResponder 傳遞給下一個響應者,若是傳遞到UIApplication仍是不能響應則丟棄該事件bash

6.UI 卡頓掉幀的緣由

當 FPS 低於 60 的時候,肉眼就會感到卡頓多線程

因此每一幀繪製的時間須要小於 1000ms / 60 ≈ 16.7ms 纔不會感受到卡頓併發

系統生成圖像信號是靠 CPU + GPU 共同工做的,因此優化的話也是從這兩方面入手考慮異步

7. block 相關

概念

  • 將 「函數」 及 「執行其上下文」 封裝起來的 「對象」
  • block的調用就是函數的調用

block捕獲變量特性

在block中使用外部變量時,block會捕獲其變量,具體規則以下

  • 局部變量爲基本數據類型:捕獲其值
  • 局部變量爲對象類型:連同全部權修飾符一塊兒捕獲
  • 局部變量爲靜態的:以指針的形式捕獲
  • 全局變量:不捕獲
  • 全局靜態變量:不捕獲

__block

使用場景:在blcok內部對捕獲的值進行賦值

  • 局部變量爲基本數據類型、對象類型,須要__block
  • 靜態局部變量、全局變量、全局靜態變量,不須要__block,由於靜態局部變量不捕獲其指針,全局變量、全局靜態變量不捕獲

8. OC 開發中碰到的設計模式

  • 觀察者模式:KVO、NSNotification
  • 代理模式:如 tableView 的 delegate 與 dataSource
  • 責任鏈模式:事件響應鏈

9.Runtime

概念:

Objective-C 擴展了 C 語言,並加入了面向對象特性和消息傳遞機制,而這個擴展的核心是一個用 C 和 編譯語言 寫的 Runtime 庫。它是 Objective-C 面向對象和動態機制的基石。

isa 指針(一圖勝千言)

消息傳遞機制:(一圖勝千言)

消息轉發機制:(一圖勝千言)

使用場景:

  • 關聯對象(Objective-C Associated Objects)給分類增長屬性
  • Method Swizzling 各類 HOOK 操做
  • 實現 NSCoding 的自動歸檔和自動解檔
  • 實現字典和模型的自動轉換( MJExtension、YYModel )

10.RunLoop

概念:

經過內部維護的事件循環來對事件、消息進行管理的一個對象 沒有消息的時候休眠以免資源佔用(用戶態轉爲內核態),有消息時當即被喚醒(內核態轉爲用戶態)

做用

  • 保持 App 的持續運行
  • 處理 App 中的各類事件(觸摸、timer...)
  • 節省 CPU 資源以提升程序性能

其餘

  • RunLoop 在同一段時間只能且必須在一種特定的 Mode 下運行
  • 更換 Mode 時須要退出當前 Loop 而後重啓新的 Loop
  • RunLoop 與線程是一一對應的
  • 本身建立的線程默認是沒有 RunLoop 的

RunLoop in cocoa

  • NSTimer
  • UIEvent
  • @autoreleasepool
  • CADisplayLink
  • GCD 中 dispatch 到 main queue 的 block 被分發到 Main RunLoop 執行

11.多線程相關

相關概念

隊列:負責任務的調度 線程:負責任務的執行

// OC 中涉及的隊列
dispatch_queue_t _cocurrentQueue;
dispatch_queue_t _globalCocurrentQueue;
dispatch_queue_t _serialQueue;
dispatch_queue_t _mainQueue;  
複製代碼

串行隊列

_serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
_mainQueue = dispatch_get_main_queue();
複製代碼

並行隊列

_cocurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
_globalCocurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
複製代碼

系統提供的並行隊列優先級

#define DISPATCH_QUEUE_PRIORITY_HIGH 2
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
複製代碼
  • 同步提交任務到串行隊列 按順序執行
  • 異步提交任務到串行隊列 按順序執行,雖然是異步,可是有串行隊列的特色,前一個任務沒有結束,隊列不會調度
  • 同步提交任務到並行隊列 按順序執行,雖然並行隊列不用等待前一個任務結束,可是是同步執行,因此不會開新線程,仍是會順序執行
  • 異步提交任務到並行隊列 不按順序執行,異步開啓新線程 + 並行隊列的特色,能夠實現任務的併發,不是馬上執行

小紅書面試題:有5個任務,要求前三個任務順序執行,四、5兩個任務並行執行,並在5個任務都執行結束後執行其餘

{
    dispatch_queue_t global_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_async(group, global_queue, ^{
        dispatch_sync(global_queue, ^{
            sleep(5);
            NSLog(@"1 %@",[NSThread currentThread]);
        });
        dispatch_sync(global_queue, ^{
            sleep(3);
            NSLog(@"2 %@",[NSThread currentThread]);
        });
        dispatch_sync(global_queue, ^{
            sleep(1);
            NSLog(@"3 %@",[NSThread currentThread]);
        });
    });
    
    dispatch_group_async(group, global_queue, ^{
        NSLog(@"4 %@",[NSThread currentThread]);
    });
    
    dispatch_group_async(group, global_queue, ^{
        NSLog(@"5 %@",[NSThread currentThread]);
    });
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"三個任務都執行完畢後執行");
    });
}
複製代碼

執行結果:

攜程面試題:在用戶登陸結束後,並行執行用戶的操做

{
    dispatch_sync(_globalCocurrentQueue, ^{
        NSLog(@"登陸");
    });
    
    dispatch_async(_globalCocurrentQueue, ^{
        NSLog(@"下載攻略");
    });
    
    dispatch_async(_globalCocurrentQueue, ^{
        NSLog(@"下載音樂");
    });
}
複製代碼

12.HTTP 請求 get與post 區別

  • 形式上的區別: get 請求參數拼接在 url 以後以 ?分割,post 請求參數在報文體中 因此說 post 請求方式參數體積要大於 get
  • 語義上的區別: get :獲取資源,安全的、冪等的、可緩存的 post:處理資源,不安全的、不冪等的,不可緩存的

安全的:不引發 server 端任何狀態變化 冪等的:同一請求方法執行屢次與執行一次效果相同

13.HTTPS

空了繼續更

番外

在簡書準備發佈呢,系統提示須要到 9.28 才能發,忽然想到還有個好平臺--掘金,就直接粘過來了😆

相關文章
相關標籤/搜索