SDK中合理的使用类扩展来实现类的访问控制

在SDK开发过程,有的时候需要向接入方开放一个类,这个类的某些方法需要供接入方使用,某些方法是需要给SDK内部其他类去使用,在其他编程语言,可以通过privateprotectedpublic等类似关键词进行访问控制,但是在Objective-C中却无法通过这些关键词进行控制。(OC中@private@public,只能控制成员变量,但是这里讨论的是包含属性和方法)

例如以下的类:(文件RXClassExtObject.h)

@interface RXClassExtObject : NSObject
@property (nonatomic, copy) NSString *str1;
- (void)print1;

@property (nonatomic, copy) NSString *str2;
- (void)print2;
@end

其中str1print1是供接入方使用的,而str2print2是SDK内部其他类需要使用到的。

这个时候如果要实现访问控制可以改成如下的代码

// 文件RXClassExtObject.h
@interface RXClassExtObject : NSObject
@property (nonatomic, copy) NSString *str1;
- (void)print1;
@end

// 文件RXClassExtObject+Private.h
@interface RXClassExtObject ()
@property (nonatomic, copy) NSString *str2;
- (void)print2;
@end

// 文件RXClassExtObject.m
#import "RXClassExtObject.h"
#import "RXClassExtObject+Private.h"
@implementation RXClassExtObject
- (void)print1 {
    NSLog(@"str1:%@", self.str1);
}
- (void)print2 {
    NSLog(@"str1:%@, str2:%@", self.str1, self.str2);
}
@end

这样的话,如果SDK内部其他类需要使用str2print2的时候,就直接在文件前面加上#import RXClassExtObject+Private.h

当然这里需要说明以下两点:

  1. 当然使用Category也可以实现,但是添加属性的时候还需要添加runtime相关代码,比较麻烦。而且Category一般是给系统类或者其他第三方库的类添加扩展,如果是自己写的完全没有必要写Category。(iOS中很多类的头文件(例如UIView)中都有Category,但是那个是做方法归类使用的)

  2. 特别需要注意一点的是,记得在.m文件添加中#import "RXClassExtObject+Private.h"print2编译不通过是小事,如果这个扩展全是属性,并且这个类是抽象类,子类在使用这个扩展中的属性的时候就会出现崩溃,出现类似于unrecognized selector sent to instance崩溃,这个地方是一定要注意的。

你可能感兴趣的:(SDK中合理的使用类扩展来实现类的访问控制)