iOS关于runtime之对象实例的基本操作
先定义一个业务对象,如下所示定义了一个Person业务对象
Person.h代码
#import <Foundation/Foundation.h> @interface Person : NSObject { @public NSString* var1; } @property (nonatomic,strong) NSMutableArray* friends; @property int age; @property NSString* name; -(NSString*) getVar1; -(void) setVar1 : (NSString*) newVar1; @end
Person.m代码
#import "Person.h" @implementation Person -(NSString*) getVar1{ return var1; } -(void) setVar1 : (NSString*) newVar1{ var1=newVar1; } @end
接下来开始使用上面定义好的Person对象。
在使用前,先引用需要的h文件。
#import "Person.h" #include <objc/runtime.h>
先初始化Person对象,然后打印设置的数据,然后在通过runtime获取并修改该对象的数据,然后打印出新数据。
Person* mPerson = [[Person alloc]init]; [mPerson setName:@"周xxx"]; [mPerson setAge:20]; [mPerson setFriends:[[NSMutableArray alloc] initWithObjects:@"A1",@"A2", nil]]; [mPerson setVar1:@"oldVar"]; NSLog(@"OLD:mPerson:age=%d,name=%@,friends=%@,var1=%@",mPerson.age,mPerson.name,mPerson.friends,[mPerson getVar1]); [self testRuntime2:mPerson]; NSLog(@"NEW:mPerson:age=%d,name=%@,friends=%@,var1=%@",mPerson.age,mPerson.name,mPerson.friends,[mPerson getVar1]);
使用runtime的方法:
-(void) testRuntime2: (id) obj { NSLog(@"testRuntime2():ViewController03"); unsigned int propertyCount; Ivar* ivars = class_copyIvarList([obj class], &propertyCount); NSLog(@"属性数量=%d",propertyCount); for (int i=0; i<propertyCount; i++) { NSLog(@"-----------属性 ---------"); Ivar ivar = ivars[i]; //获取对象的属性名 const char* name = ivar_getName(ivar); NSString* propertyName = [NSString stringWithUTF8String:name]; NSLog(@"属性名=%@",propertyName); //获取对象的属性对应的值 id value = [obj valueForKey:propertyName]; NSLog(@"%@=%@",propertyName,value); //获取对象属性的类型 const char* type = ivar_getTypeEncoding(ivar); NSString* propertyType = [NSString stringWithUTF8String:type]; NSLog(@"%@的数据类型为%@",propertyName,propertyType); //设置对象属性 if ([@"i" isEqualToString:propertyType]) { //数据类型为int [obj setValue:@(100) forKey:propertyName]; } if ([@"@\"NSString\"" isEqualToString:propertyType]) { //数据类型为NSString [obj setValue:@"NewString" forKey:propertyName]; } if ([@"@\"NSMutableArray\"" isEqualToString:propertyType]) { NSLog(@"----NSMutableArray"); [obj setValue:[[NSMutableArray alloc] initWithObjects:@"B1",@"B2", nil] forKey:propertyName]; } } }