您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)runtime如何在IOS 中使用,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
新建兩個(gè)類ClassOne和ClassTwo
#import <Foundation/Foundation.h> @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 <Foundation/Foundation.h> @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.拷貝對(duì)象
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"]; //方法對(duì)應(yīng)的C函數(shù) 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\"" }; //訪問(wèn)類型 objc_property_attribute_t ownership = { "C", "" }; //對(duì)應(yīng)成員變量名稱 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:@@@"); //屬性對(duì)應(yīng)的Getter方法 NSString* testPropertyNameGetter(id self,SEL _cmd){ Ivar ivar = class_getInstanceVariable([ClassOne class], "_testPropertyName"); return object_getIvar(self, ivar); } //屬性對(duì)應(yīng)的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(@"通過(guò)Associate設(shè)置:%@",value);
5.獲取類的名稱
ClassOne *one = [ClassOne new]; const char *className = object_getClassName(one); NSLog(@"className:%@",[NSString stringWithUTF8String:className]);
6.獲取一個(gè)類的所有方法
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(@"方法名:%@",NSStringFromSelector(sel)); }
7.獲取一個(gè)類的所有屬性
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.獲取類的所有成員變量
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.獲得成員變量類型
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]); }
上述就是小編為大家分享的runtime如何在IOS 中使用了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。