IOS 中runtime使用方法整理
来源:爱站网时间:2020-04-21编辑:网友分享
对于运行时中的特定方法调用进程,首先在相应操作对象的缓存方法列表中找到被调用的方法,如果找到,则转到相应的实现并执行,今天爱站技术频道和大家分享了IOS 中runtime使用方法整理,一起进入下文学习吧!
对于运行时中的特定方法调用进程,首先在相应操作对象的缓存方法列表中找到被调用的方法,如果找到,则转到相应的实现并执行,今天爱站技术频道和大家分享了IOS 中runtime使用方法整理,一起进入下文学习吧!
IOS 中runtime使用方法整理
做iOS的朋友都知道或听说runtime,这个东西很像java的反射机制,但功能远胜于java的反射。通过runtime我们可以动态的向一个类中添加属性、成员变量、方法,以及对其进行读写访问。
新建两个类ClassOne和ClassTwo
#import@interface ClassOne : NSObject{ NSString *_publicVar1; NSString *_publicVar2; } @property(nonatomic,copy) NSString *publicProperty1; @property(nonatomic,copy) NSString *publicProperty2; - (void) testClassOneWithArg1:(NSString *)arg1; @end #import "ClassOne.h" @interface ClassOne() @property(nonatomic,copy) NSString *privateProperty1; @property(nonatomic,copy) NSString *privateProperty2; @end @implementation ClassOne{ NSString *_privateVar1; NSString *_privateVar2; } - (void)testClassOneWithArg1:(NSString *)arg1{ NSLog(@"this is CalssOne, arg1:%@",arg1); } - (void)testClassOneWithArg1:(NSString *)arg1 arg2:arg2{ NSLog(@"this is CalssOne, arg1:%@ arg2:%@",arg1,arg2); } @end
#import@interface ClassTwo : NSObject - (void) testClassTwoWithArg1:(NSString *)arg1 arg2:(NSString *)arg2; @end #import "ClassTwo.h" @implementation ClassTwo - (void)testClassTwoWithArg1:(NSString *)arg1 arg2:(NSString *)arg2{ NSLog(@"this is ClassTwo arg1:%@,arg2:%@",arg1,arg2); } @end
1.拷贝对象
ClassOne *one = [ClassOne new]; id onec1 = object_copy(one,sizeof(one));
2.给类添加方法
ClassOne *one = [ClassOne new]; class_addMethod([ClassOne class], @selector(testClassOneWithArg1:arg2:arg3:), (IMP)testClassOne , "i@:@@@"); [one testClassOneWithArg1:@"arg1" arg2:@"arg2" arg3:@"arg3"]; //方法对应的C函数 int testClassOne(id self,SEL _cmd, NSString *arg1,NSString *arg2,NSString *arg3){ NSLog(@"this is a test function add to ClassOne as a methad with arg1:%@ arg2:%@ and arg3:%@",arg1,arg2,arg3); return 10; }
3.添加属性(方式一)
//属性类型 objc_property_attribute_t type = { "T", "@\"NSString\"" }; //访问类型 objc_property_attribute_t ownership = { "C", "" }; //对应成员变量名称 objc_property_attribute_t backingivar = { "V", "_testPropertyName" }; objc_property_attribute_t attrs[] = { type, ownership, backingivar }; class_addProperty([ClassOne class], "testPropertyName", attrs, 3); class_addMethod([ClassOne class], @selector(testPropertyName), (IMP)testPropertyNameGetter , "@:@@"); class_addMethod([ClassOne class], @selector(setTestPropertyName:), (IMP)testPropertyNameSetter, "v:@@@"); //属性对应的Getter方法 NSString* testPropertyNameGetter(id self,SEL _cmd){ Ivar ivar = class_getInstanceVariable([ClassOne class], "_testPropertyName"); return object_getIvar(self, ivar); } //属性对应的Setter方法 void testPropertyNameSetter(id self,SEL _cmd,NSString *testPropertyNameValue){ Ivar ivar = class_getInstanceVariable([ClassOne class], "_testPropertyName"); object_setIvar(self, ivar, testPropertyNameValue); }
4.添加属性(方式2)
ClassOne *one = [ClassOne new]; objc_setAssociatedObject(one, "objTag", @"value", OBJC_ASSOCIATION_COPY); NSString *value = objc_getAssociatedObject(one, "objTag"); NSLog(@"通过Associate设置:%@",value);
5.获取类的名称
ClassOne *one = [ClassOne new]; const char *className = object_getClassName(one); NSLog(@"className:%@",[NSString stringWithUTF8String:className]);
6.获取一个类的所有方法
UInt count; Method *methods = class_copyMethodList([ClassOne class], &count); for (int i = 0; i
7.获取一个类的所有属性
uint propertyCount; objc_property_t *ps = class_copyPropertyList([ClassOne class], &propertyCount); for (uint i = 0; i
8.获取类的所有成员变量
uint ivarCount; Ivar *ivars = class_copyIvarList([ClassOne class], &ivarCount); for (uint i = 0; i
9.获得成员变量类型
uint ivarCount; Ivar *ivars = class_copyIvarList([ClassOne class], &ivarCount); for (uint i = 0; i
以上是爱站技术频道为大家介绍的IOS 中runtime使用方法整理,我们在学习的过程中一定要多多对比,看看其他人的做法,要学习他人的优越之处。
上一篇:iOS开发中应用数据的存储方式