在ios開發(fā)中經(jīng)常會用到第三方庫.還會用到第三方庫的一些私有屬性.但是我們又不能直接修改第三方庫的源碼.
(為什么不能改?)很多人就很疑惑了,源代碼都有了,還不是想怎么改就怎么改.個人經(jīng)驗,對第三方庫使用,禁止修改源代碼.
舉個栗子:
假如我們需要獲的SDImageCache 類提供的緩存的DiskCachePath 這個屬性值的內(nèi)容.但是它又沒公開.
我建議通過一個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;
}
這里注意方法名的問題.
假如我們?yōu)镾DImageCache+ERCachePath.h 定義一個屬性
@property(nonatomic,copy,readonly)NSString *diskCachePath;
通過實現(xiàn)他的get方法 來獲取這個值 則會進入死循環(huán).
-(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;
}
根據(jù)屬性名,生成系統(tǒng)自動生成的get屬性方法. 調(diào)用msgSend方法. 發(fā)送消息.
這里需要注意調(diào)用msgSend會報 Too many arguments to function call, expected 0, have 2
需要設(shè)置
選中項目 - Project - Build Settings - ENABLE_STRICT_OBJC_MSGSEND 將其設(shè)置為 NO 即可
這里依然本質(zhì)還是調(diào)用了系統(tǒng)自動生成的get方法.所以不能在擴展中重寫這個屬性的get方法.