在 SDK 開發中,經常會碰到一個問題,假設 SDKUser.h 是 SDK 對外暴露的 Header, 其中 SDKUser 類型中的 uid 屬性是不對外暴露的,但在 SDK 中的某些私有類需要獲取這個屬性(或方法),這個時候我們需要怎麼處理呢?uid 屬性是一個對 SDK 外是不可以見的,但對 SDK 內是可見的,這種情況,就可以使用 Category 來解決這個問題:
SDKUser.h 對外暴露的頭文件:
@interface SDKUser : NSObject @property(nonatomic, copy, readonly) NSString *username; @end
在對外暴露的 Header 中,如果我們不希望外部來寫這個對象的時候,我們需要將屬性設置為只讀屬性,但是我們又需要在對內支持讀寫,這時我們需要在實現文件裡重新設置該屬性支持讀寫操作。
SDKUser.m 實現文件:
#import "SDKUser.h" @interface SDKUser() // 對外屬性 @property(nonatomic, copy, readwrite) NSString *username; // 只對內屬性 @property(nonatomic, copy, readwrite) NSString *uid; @end @implementation SDKUser @end
因為 username 屬性在 SDK 內是支持讀寫操作的,所以需要設置為 readwrite,而 uid 這個屬性這裡是不希望暴露給用戶的,所以我們將該屬性定義在 .m 文件裡中,但是定義 .m 文件裡時,只支持類內的訪問,如果 SDK 內的其它私有類想訪問就無法訪問到這個屬性了。
這種情況下,我們可以對 SDKUser 這個類進行 Category,並將 SDK 裡的相關私有屬性(或方法)實現在裡面:
#import "SDKUser.h" @interface SDKUser (SDKInner) // 基本屬性 @property(nonatomic, copy) NSString *uid; @property(nonatomic, copy, readonly) NSString *username; @end -------------------------------- #import "SDKUser+SDKInner.h" @implementation SDKUser (SDKInner) @end
這樣的話 SDK 內的私有類就可以訪問 SDKUser 裡面的 uid 屬性,並且又不會暴露給開發者。