OC語言特性相關

1. 分類-category

  • 如何使用編程

    1. 聲明私有方法
    2. 分解體積龐大的類文件
    3. 把Framework的私有方法公開等
  • 分類的特色(與擴展的區別)設計模式

    1. 運行時決議
    2. 能夠爲系統類添加分類
    3. 可聲明,可實現
  • 分類能夠添加什麼安全

    1. 實例方法
    2. 類方法
    3. 協議
    4. 屬性(只生成get、set方法,不生成實例變量),可添加關聯對象
    • 分類添加的方法能夠「覆蓋」原類的方法
    • 同名分類方法最後被編譯的分類最優先生效
    • 命名相同的分類會引發編譯錯誤
  • 分類成員結構 bash

    分類的成員結構

  • 分類的加載調用棧 ui

    QQ20190509-012729@2x

2. 關聯對象

id objc_getAssociatedObject(id object, const void *key)


void objc_setAssociatedObject(id object, const void *key, id value, object_AssociationPolicy policy)


void objc_removeAssociatedObject(id object)

複製代碼

關聯對象由AssociationsManger管理並在AssociationsHashMap存儲。全部對象的關聯內容都在同一個全局容器中。編碼

關聯對象的本質

QQ20190509-015117@2x

3. 擴展-Extension

  • 使用atom

    1. 聲明私有屬性
    2. 聲明私有方法
    3. 聲明私有成員變量
    • 編譯時決議
    • 只以聲明的形式存在,多數狀況下寄生於宿主類的.m中
    • 不能爲系統類添加擴展

4. 代理-Delegate

  • 是一種軟件設計模式spa

    • iOS中以@protocol的形式體現
    • 傳遞方式一對一

    圖解

5. 通知-NSNotification

  • 設計模式 —— 觀察者模式
    • 使用觀察者模式來實現的用於跨層傳遞消息的機制
    • 傳遞方式一對多

通知

  • 實現機制線程

    通知原理

6. KVO

  • 觀察者模式設計

    • 是Key-value observing的縮寫
    • 是OC對觀察者模式的又一實現
    • 使用了isa混寫(isa-swizzling)來實現

    kvo圖解

    • 使用setter方法改變值KVO纔會生效
    • 使用setVaule:forKey:改變值KVO纔會生效
    • 成員變量直接修改不會生效,可手動觸發

7. KVC

  • Key-value coding的縮寫

    • Apple 提供的鍵值編碼技術
      • (id)valueForKey:(NSString *)key
      • (id)setValue:(id)value forKey:(NSString *)key
    • 破壞了面向對象編程思想

    訪問

    訪問順序

    1. _key
    2. _isKey
    3. key
    4. isKey

    設置

8. 屬性關鍵字

  • 讀寫權限
    • readonly
    • readwrite(默認)
  • 原子性
    • atomic(默認,保證賦值和獲取是線程安全的,如操做並非線程安全的)
    • nonatomic
  • 引用計數
    • retain/strong
    • assign/unsafe_unretained
      • assign
        • 既可修飾基本數據類型,又可修飾對象
        • 修飾基本數據類型,如int、 BOOL
        • 修飾對象類型時,不改變其引用計數
        • 會產生懸垂指針
    • weak
      • 只能修飾對象
      • 不改變被修飾對象的引用計數
      • 所指對象在被釋放後會自動置爲nil
    • copy
      • 淺拷貝
        • 增長被拷貝對象的引用計數
        • 沒有新的內存分配
      • 深拷貝
        • 產生新的內存分配
        • 不會增長被拷貝對象的引用計數

9. MRC下重寫retain修飾變量的setter方法

@property (nonatomic, retain) id obj:

- (void)setObj:(id)obj {
    if (_obj != obj) { // 防止傳入同一個變量被釋放,後面訪問出錯
        [_obj release];
        _obj = [obj retain];
    }
}

複製代碼
相關文章
相關標籤/搜索