对第三方库的扩展.在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方法.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,067评论 19 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,220评论 6 13
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,262评论 4 61
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,824评论 0 9
  • 《鸭子?兔子?》那本绘本讲的就是不同角度看到的同一个动物竟被看成是不同的两个动物。生活中我们往往执迷于我们自己的立...
    艾米黎妈阅读 447评论 0 0