对第三方库的扩展.在category中获取对象的私有属性值.

在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;
}
9CFF70A3-28B6-4E0C-8C98-E994BD2C2B55.png

第二种方案:使用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方法.

你可能感兴趣的:(对第三方库的扩展.在category中获取对象的私有属性值.)