iOS 對象,消息,運行期

<a >Effective Objective C 2.0:編寫高質量iOS與OS X代碼的52個有效方法</a>

第 6 條: 理解"屬性"這一概念###

要點:####

  1. 可以用@property 語法來定義對象中所封裝的數據.
  2. 通過"特質"來指定存儲數據所需的正確語義.
  3. 在設置屬性所對應的實例變量時,一定要遵從該屬性所聲明的語義.
  4. 開發ios程序時應該使用nonatomic 屬性, 因為atomic 屬性會嚴重影響性能.

第 7 條: 在對象內部盡量直接訪問實例變量###

要點:####

  1. 在對象內部讀取數據時,應該直接通過實例變量來讀,而寫入數據時,則應通過屬性來寫.
  2. 在初始化方法及 dealloc 方法中,總是應該直接通過實例變量來讀寫數據.
  3. 有時會使用惰性初始化技術配置某份數據,這種情況下,需要通過屬性來讀取數據.

第 8 條: 理解"對象等同性" 這一概念###

要點:####

  1. 若想檢測對象的等同性,請提供 "isEqual:" 與hash 方法.
  2. 相同的對象必須具有相同的哈希碼,但是兩個哈希碼相同的對象卻未必相同.
  3. 不要盲目地逐個檢測每條屬性, 而是應該依照具體需求來制定檢測方案.
  4. 編寫hash 方法時,應該使用計算速度快而且哈希碼碰撞幾率低的算法.

第 9 條: 以"類族模式"隱藏實現細節###

要點:####

  1. 類族模式可以把實現細節隱藏在一套簡單的公共接口后面.
  2. 系統框架中經常使用類族.
  3. 從類族的公共抽象基類中繼承子類時要當心,若有開發文檔,則應首先閱讀.

第 10 條: 在既有類中使用關聯對象存放自定義數據###

要點:####

  1. 可以通過"關聯對象"機制來把兩個對象連起來.
  2. 定義關聯對象時可指定內存管理語義,用以模仿定義屬性時所采用的"擁有關系"與"非擁有關系".
    3.只有在其它做法不可行時才應選用關聯對象,因為這種做法通常會引入難于查找的BUG.

第 11 條: 理解objc_msgSend的作用###

要點:####

  1. 消息由接收者,選擇子及參數構成.給某對象"發送消息"也就相當于在該對象上"調用方法".
  2. 發給某對象的全部消息都要由"動態消息派發系統"來處理,該系統會查出對應的方法,并執行其代碼.

第 12 條: 理解消息轉發機制###

要點:####

  1. 若對象無法響應某個選擇子,則進入消息轉發流程.
  2. 通過運行期的動態方法解析功能,我們可以在需要用到某個方法時再將其加入類中.
  3. 對象可以把其無法解讀的某些選擇子轉交給其他對象來處理.
  4. 經過上述兩步之后,如果還是沒辦法處理選擇子,那就啟動完整的消息轉發機制.

第 13 條: 用"方法調配技術"調試"黑盒方法"###

要點:####

  1. 在運行期,可以向類中新增或替換選擇子所對應的方法實現.
  2. 使用另一份實現來替換原有的方法實現,這道工序叫做"方法調配",開發都常用此技術向原有實現中添加新功能.
  3. 一般來說,只有調試程序的時候才需要在運行期修改方法實現,這種做法不宜濫用.

第 14 條: 理解"類對象"的用意###

要點:####

  1. 每個實例都有一個指向Class對象的指針,用以表明其類型,而這些Class對象則構成了類的繼承體系.
  2. 如果對象類型無法在編譯期確定,那么就應該使用類型信息查詢方法來探知.
  3. 盡量使用類型信息查詢方法來確定對象類型,而不是直接比較類對象,因為某些對象可能實現了消息轉發功能.
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容