在 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 属性,并且又不会暴露给开发者。