1. 程式人生 > >iOS學習之-擴充套件機制category與associative

iOS學習之-擴充套件機制category與associative

標籤(空格分隔): iOS category associative

OC的執行時提供了兩種機制來對已有的類進行擴充套件:

  • category 對原有的方法進行擴充套件
  • associative 對原有的屬性進行擴充套件
    這兩者在《Effective Objective-C 2.0》裡面都有講解,分別在第10條和第26條專門做了介紹,這裡先介紹兩種技術,再說明兩者之間的差異化用法。

category 分類

這個OC的機制大家應該很熟悉了,就是對原有類的擴充套件。《Effective Objective-C 2.0》裡面第24,25,26條對category有專門講解。可以檢視專門的這些章節來看下,其中幾個要點就是:

  • 類的實現程式碼可以分散到各個分類當中,這樣便於整體程式碼清晰,並且方便除錯
  • 給分類加上字首,防止出現命名衝突,這點OC沒有C++類似名稱空間的機制讓人無語,大工程OC命名上就會讓人痛苦死。與其這樣不如早點將這個問題解決。
  • 不要在分類中宣告屬性,這個後續還會講解。

associative 關聯物件

關聯物件平時接觸的很少,之前最近看到幾個開源庫裡面都有用到,索性研究透這個,也是極好的。
關聯物件的使用場景是在一些無法建立子類的例項,或者在category中想擴充套件類的屬性。這些場景中關聯物件就用到了。

要包含標頭檔案才 objc/runtime.h 可以使用關聯物件, 關聯物件用到的方法主要有:

  • void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
    以給定的鍵和策略為某物件設定管理值。
  • id objc_getAssociatedObject(id object, const void *key)
  • void objc_removeAssociatedObjects(id object)
    移除指定物件的全部關聯物件。

管理策略(objc_AssociationPolicy)是用以維護對應的“記憶體管理語義”,是一些列舉值,對應了相應的屬性概念:

關聯型別 等效的@property屬性
OBJC_ASSOCIATION_ASSIGN assign
OBJC_ASSOCIATION_RETAIN_NONATOMIC nonatomic retain/strong
OBJC_ASSOCIATION_COPY_NONATOMIC nonatomic copy
OBJC_ASSOCIATION_RETAIN retain atomic
OBJC_ASSOCIATION_COPY copy

這篇文章對這個的使用分析的挺好,其中有一點就是key的選取,經常使用_cmd,比如
objc_setAssociatedObject(self, _cmd, cachesByIndexPath, OBJC_ASSOCIATION_RETAIN);
一開始很是不解,但是看到下面這段話:

Since SELs are guaranteed to be unique and constant, you can use _cmd as the key for objc_setAssociatedObject(). #objective-c #snowleopard

明白沒?SELS是唯一的,因此可以用_cmd作為key,so tricky!