iOS runtime 運行時( 二 深談)

Attention!
iOS runtime 運行時( - 俗談)
iOS runtime 運行時( 二 深談)
iOS runtime 運行時( 三 深談)
iOS runtime 運行時( 四 深談)
逆天的來了******
我們在編程過程中,如果使用到了runtime(運行時),我們幾乎都是想動態的改變這個類的信息,包括方法,屬性,balabala的,并且獲得這個類的一些信息,等等,下面我們就來看看怎么通過runtime提供的方法,來達到這些目的
1). 獲取 這個類的所有屬性
.h 文件

@interface RTObj :NSObject
@property(nonatomic,copy)NSString*name;
@property(nonatomic,copy)NSString*webUrl;
@property(nonatomic,copy)NSString*imageUrl;
@property(nonatomic,copy)NSString*type;
-(void)sort;
@end```

.m 文件
```#import"RTObj.h"
@implementationRTObj
@end```
獲取這個類的所有屬性,首先先包含#import<objc/message.h>,然后調用如下的方法

unsigned int outCount =0;
Ivarvars = class_copyIvarList([RTObj class], &outCount);//獲取到所有的成員變量列表
//遍歷所有的成員變量
for(int i =0; i < outCount; i++) {
Ivar ivar= vars[i];//取出第i個位置的成員變量
constchar
propertyName = ivar_getName(ivar);//獲取變量名
constchar*propertyType = ivar_getTypeEncoding(ivar);//獲取變量編碼類型
printf("---%s--%s\n", propertyName, propertyType);
//或者NSLog(@"---%s--%s\n", propertyName, propertyType);
}


打印結果
**---_name--@"NSString"**
**---_webUrl--@"NSString"**
**---_imageUrl--@"NSString"**
**---_type--@"NSString"**
**然后你就可以 自己去擴展自己的編程思路了,需要注意的是,父類的屬相并不會打印出來,也就是 通過這個方法,獲取不到父類的 屬性**
2).改變該類的對象的某一個屬性的值
有這樣一個對象

RTObj*rtObj = [[RTObj alloc]init];

現在通過 運行時提供的方法,來檢查里面有沒有 name這個屬性,如果有就賦值,沒有不賦值,

RTObjrtObj = [[RTObj alloc]init];
unsigned int outCount =0;
Ivar
vars =class_copyIvarList([rtObj class], &outCount);//獲取到所有的成員變量列表
//遍歷所有的成員變量
for(inti =0; i < outCount; i++) {
Ivarivar = vars[i];//取出第i個位置的成員變量
constcharpropertyName =ivar_getName(ivar);//獲取變量名
constchar
propertyType =ivar_getTypeEncoding(ivar);//獲取變量編碼類型
NSString*proOcName = [NSString stringWithUTF8String:propertyName];
if([proOcName isEqualToString:@"_name"])
{
object_setIvar(rtObj, ivar,@"孫悟空");
}
}
NSLog(@"******:%@",rtObj.name);

最后的打印結果是
********:****孫悟空**
**簡單的例子,希望對你有 幫助,后續會繼續更新,歡迎大家留言,吐槽**
[JSON 轉Model簡單的Demo](https://github.com/YFWCQ/Demo "Title")
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容