一、简介
在使用第三方 SDK 的情况下,难免也需要在其基础上做一些调整,有的时候需要修改其私有的属性。这种情况应该怎么处理呢?
一个场景模拟: 在一个 SDK 中,有一个 Class 是 HGObject,有一个私有属性是 name。现在想要操作这个 name。
二、具体的方案
具体的方案有两种:
- 1、使用 KVC
- 2、使用分类
接下来分别介绍一下。
2.1 使用 KVC
这个方案,应该是很多人使用的,代码类似于这样的:
{ // 通过 KVC 访问私有属性
HGObject* obj = [[HGObject alloc] init];
// KVC 设置值
[obj setValue:@"KVC_Value" forKey:@"name"];
// 通过 KVC 获取值
NSString* value = [obj valueForKey:@"name"];
NSLog(@"通过 KVC 获取的值是 : %@", value);
}
这种方式,在使用上很简单,毕竟 KVC 是 OC 的固有特性。
2.2 使用分类
直接创建一个分类,然后重新再分类中申明一个同样的属性。然后在使用的时候与公开的属性一致。代码类似于这样:
{ // 通过分类操作私有属性
HGObject* obj = [[HGObject alloc] init];
obj.name = @"Category_Value";
NSLog(@"通过分类操作私有属性 = %@", obj.name);
}
三、特别提醒
一旦由于 SDK 的升级在内部将私有属性删除,那么两种方案均会闪退。所以每次 SDK 升级之后一定要做好复查。为了避免闪退,每次调用都应该使用 respondsToSelector: 。具体可以参考我的代码:OC2Nature项目中 HGPrivate 目录
有更多更好的方案, 欢迎讨论!