iOS學習之-擴充套件機制category與associative
阿新 • • 發佈:2019-02-07
標籤(空格分隔): 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!