IOS 中runtime使用方法整理
IOS中runtime使用方法整理
做iOS的朋友都知道或听说runtime,这个东西很像java的反射机制,但功能远胜于java的反射。通过runtime我们可以动态的向一个类中添加属性、成员变量、方法,以及对其进行读写访问。
新建两个类ClassOne和ClassTwo
#import@interfaceClassOne:NSObject{ NSString*_publicVar1; NSString*_publicVar2; } @property(nonatomic,copy)NSString*publicProperty1; @property(nonatomic,copy)NSString*publicProperty2; -(void)testClassOneWithArg1:(NSString*)arg1; @end #import"ClassOne.h" @interfaceClassOne() @property(nonatomic,copy)NSString*privateProperty1; @property(nonatomic,copy)NSString*privateProperty2; @end @implementationClassOne{ NSString*_privateVar1; NSString*_privateVar2; } -(void)testClassOneWithArg1:(NSString*)arg1{ NSLog(@"thisisCalssOne,arg1:%@",arg1); } -(void)testClassOneWithArg1:(NSString*)arg1arg2:arg2{ NSLog(@"thisisCalssOne,arg1:%@arg2:%@",arg1,arg2); } @end
#import@interfaceClassTwo:NSObject -(void)testClassTwoWithArg1:(NSString*)arg1arg2:(NSString*)arg2; @end #import"ClassTwo.h" @implementationClassTwo -(void)testClassTwoWithArg1:(NSString*)arg1arg2:(NSString*)arg2{ NSLog(@"thisisClassTwoarg1:%@,arg2:%@",arg1,arg2); } @end
1.拷贝对象
ClassOne*one=[ClassOnenew]; idonec1=object_copy(one,sizeof(one));
2.给类添加方法
ClassOne*one=[ClassOnenew]; class_addMethod([ClassOneclass],@selector(testClassOneWithArg1:arg2:arg3:),(IMP)testClassOne,"i@:@@@"); [onetestClassOneWithArg1:@"arg1"arg2:@"arg2"arg3:@"arg3"]; //方法对应的C函数 inttestClassOne(idself,SEL_cmd,NSString*arg1,NSString*arg2,NSString*arg3){ NSLog(@"thisisatestfunctionaddtoClassOneasamethadwitharg1:%@arg2:%@andarg3:%@",arg1,arg2,arg3); return10; }
3.添加属性(方式一)
//属性类型 objc_property_attribute_ttype={"T","@\"NSString\""}; //访问类型 objc_property_attribute_townership={"C",""}; //对应成员变量名称 objc_property_attribute_tbackingivar={"V","_testPropertyName"}; objc_property_attribute_tattrs[]={type,ownership,backingivar}; class_addProperty([ClassOneclass],"testPropertyName",attrs,3); class_addMethod([ClassOneclass],@selector(testPropertyName),(IMP)testPropertyNameGetter,"@:@@"); class_addMethod([ClassOneclass],@selector(setTestPropertyName:),(IMP)testPropertyNameSetter,"v:@@@"); //属性对应的Getter方法 NSString*testPropertyNameGetter(idself,SEL_cmd){ Ivarivar=class_getInstanceVariable([ClassOneclass],"_testPropertyName"); returnobject_getIvar(self,ivar); } //属性对应的Setter方法 voidtestPropertyNameSetter(idself,SEL_cmd,NSString*testPropertyNameValue){ Ivarivar=class_getInstanceVariable([ClassOneclass],"_testPropertyName"); object_setIvar(self,ivar,testPropertyNameValue); }
4.添加属性(方式2)
ClassOne*one=[ClassOnenew]; objc_setAssociatedObject(one,"objTag",@"value",OBJC_ASSOCIATION_COPY); NSString*value=objc_getAssociatedObject(one,"objTag"); NSLog(@"通过Associate设置:%@",value);
5.获取类的名称
ClassOne*one=[ClassOnenew]; constchar*className=object_getClassName(one); NSLog(@"className:%@",[NSStringstringWithUTF8String:className]);
6.获取一个类的所有方法
UIntcount; Method*methods=class_copyMethodList([ClassOneclass],&count); for(inti=0;i7.获取一个类的所有属性
uintpropertyCount; objc_property_t*ps=class_copyPropertyList([ClassOneclass],&propertyCount); for(uinti=0;i8.获取类的所有成员变量
uintivarCount; Ivar*ivars=class_copyIvarList([ClassOneclass],&ivarCount); for(uinti=0;i9.获得成员变量类型
uintivarCount; Ivar*ivars=class_copyIvarList([ClassOneclass],&ivarCount); for(uinti=0;i感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!