在ios开发中经常会用到第三方库.还会用到第三方库的一些私有属性.但是我们又不能直接修改第三方库的源码.
(为什么不能改?)很多人就很疑惑了,源代码都有了,还不是想怎么改就怎么改.个人经验,对第三方库使用,禁止修改源代码.
举个栗子:
假如我们需要获的SDImageCache 类提供的缓存的DiskCachePath 这个属性值的内容.但是它又没公开.
我建议通过一个SDImageCache+ERCachePath.h 扩展文件来获取这个属性的值.
#import "SDImageCache.h"
@interface SDImageCache (ERCachePath)
-(NSString *)getPropertyValueByName:(NSString *)paramName;
@end
#import "SDImageCache+ERCachePath.h"
@implementation SDImageCache (ERCachePath)
-(NSString *)getPropertyValueByName:(NSString *)paramName{
id me = self;
NSString *value = [me valueForKey:paramName];
return value;
}
这里注意方法名的问题.
假如我们为SDImageCache+ERCachePath.h 定义一个属性
@property(nonatomic,copy,readonly)NSString *diskCachePath;
通过实现他的get方法 来获取这个值 则会进入死循环.
-(NSString *)diskCachePath{
id me = self;
NSString *value = [me valueForKey:@"diskCachePath"];
return value;
}
第二种方案:使用runtime获取对象的私有属性值.
-(NSString *)getPropertydiskCachePath{
NSString *propertyName = @"diskCachePath";
SEL getter = NSSelectorFromString(propertyName);
id value = objc_msgSend(self,getter);
return value;
}
根据属性名,生成系统自动生成的get属性方法. 调用msgSend方法. 发送消息.
这里需要注意调用msgSend会报 Too many arguments to function call, expected 0, have 2
需要设置
选中项目 - Project - Build Settings - ENABLE_STRICT_OBJC_MSGSEND 将其设置为 NO 即可
这里依然本质还是调用了系统自动生成的get方法.所以不能在扩展中重写这个属性的get方法.