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感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!