How to use runtime in IOS
Friends who do iOS know or hear about runtime. This thing is very similar to Java's reflection mechanism, but its function is far better than Java's reflection. Through runtime, we can dynamically add attributes, member variables, and methods to a class, and read and write access.
Create two new classes ClassOne and ClassTwo
#import <Foundation/> @interface ClassOne : NSObject{ NSString *_publicVar1; NSString *_publicVar2; } @property(nonatomic,copy) NSString *publicProperty1; @property(nonatomic,copy) NSString *publicProperty2; - (void) testClassOneWithArg1:(NSString *)arg1; @end #import "" @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 <Foundation/> @interface ClassTwo : NSObject - (void) testClassTwoWithArg1:(NSString *)arg1 arg2:(NSString *)arg2; @end #import "" @implementation ClassTwo - (void)testClassTwoWithArg1:(NSString *)arg1 arg2:(NSString *)arg2{ NSLog(@"this is ClassTwo arg1:%@,arg2:%@",arg1,arg2); } @end
1. Copy the object
ClassOne *one = [ClassOne new]; id onec1 = object_copy(one,sizeof(one));
2. Add methods to the class
ClassOne *one = [ClassOne new]; class_addMethod([ClassOne class], @selector(testClassOneWithArg1:arg2:arg3:), (IMP)testClassOne , "i@:@@@"); [one testClassOneWithArg1:@"arg1" arg2:@"arg2" arg3:@"arg3"]; //C function corresponding to the methodint 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. Add properties (Method 1)
//Attribute typeobjc_property_attribute_t type = { "T", "@\"NSString\"" }; //Access Typeobjc_property_attribute_t ownership = { "C", "" }; // Corresponding member variable nameobjc_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 method corresponding to the attributeNSString* testPropertyNameGetter(id self,SEL _cmd){ Ivar ivar = class_getInstanceVariable([ClassOne class], "_testPropertyName"); return object_getIvar(self, ivar); } //The Setter method corresponding to the attributevoid testPropertyNameSetter(id self,SEL _cmd,NSString *testPropertyNameValue){ Ivar ivar = class_getInstanceVariable([ClassOne class], "_testPropertyName"); object_setIvar(self, ivar, testPropertyNameValue); }
4. Add properties (Method 2)
ClassOne *one = [ClassOne new]; objc_setAssociatedObject(one, "objTag", @"value", OBJC_ASSOCIATION_COPY); NSString *value = objc_getAssociatedObject(one, "objTag"); NSLog(@"Settings via Associate:%@",value);
5. Get the name of the class
ClassOne *one = [ClassOne new]; const char *className = object_getClassName(one); NSLog(@"className:%@",[NSString stringWithUTF8String:className]);
6. Get all methods of a class
UInt count; Method *methods = class_copyMethodList([ClassOne class], &count); for (int i = 0; i < count; i++) { Method method = methods[i]; SEL sel = method_getName(method); NSLog(@"Method Name:%@",NSStringFromSelector(sel)); }
7. Get all properties of a class
uint propertyCount; objc_property_t *ps = class_copyPropertyList([ClassOne class], &propertyCount); for (uint i = 0; i < propertyCount; i++) { objc_property_t property = ps[i]; const char *propertyName = property_getName(property); const char *propertyAttributes = property_getAttributes(property); NSLog(@"propertyName:%@",[NSString stringWithUTF8String:propertyName]); NSLog(@"propertyAttributes:%@",[NSString stringWithUTF8String:propertyAttributes]); }
8. Get all member variables of the class
uint ivarCount; Ivar *ivars = class_copyIvarList([ClassOne class], &ivarCount); for (uint i = 0; i < ivarCount; i++) { Ivar ivar = ivars[i]; const char *ivarName = ivar_getName(ivar); NSLog(@"ivarName:%@",[NSString stringWithUTF8String:ivarName]); }
9. Obtain member variable type
uint ivarCount; Ivar *ivars = class_copyIvarList([ClassOne class], &ivarCount); for (uint i = 0; i < ivarCount; i++) { Ivar ivar = ivars[i]; const char *ivarName = ivar_getName(ivar); const char *type = ivar_getTypeEncoding(ivar); NSLog(@"ivarName=%@,type=%@",[NSString stringWithUTF8String:ivarName],[NSString stringWithUTF8String:type]); }
Thank you for reading, I hope it can help you. Thank you for your support for this site!