創建Class 添加成員變數 獲取Class的成員變數名 調用以後,結果為: 創建方法 第一個參數為類名,第二個參數為方法名,第三個參數是函數名,第四個參數是函數的返回值和參數的類型,v表是void,@表示id,:表示SEL。更多多定義參考:SELECTOR 需要實現,這個方法 添加屬性 查看屬性 ...
創建Class
1 - (Class) createNewClass { 2 const char * className; 3 className = [@"Student" UTF8String]; 4 Class kclass = objc_getClass(className); 5 //判斷此類是否已經存在,如果存在則返回,不存在就創建 6 if (!kclass) 7 { 8 Class superClass = [NSObject class]; 9 kclass = objc_allocateClassPair(superClass, className, 0); 10 } 11 return kclass; 12 }
註冊類
1 Class newClass = [self createNewClass]; 2 id instanceObjects = [[newClass alloc] init]; 3 NSLog(@"註冊後的類實例化對象:%@", instanceObjects);
列印結果:
添加成員變數
1 //添加成員變數 2 - (void) addNewVariable:(Class) newClass { 3 class_addIvar(newClass, "_stuName", sizeof(NSString *), 0, "@"); 4 }
獲取Class的成員變數名
1 // 獲取類的成員變數名 2 - (NSArray *)getVariableNamesByObject:(id)object 3 { 4 unsigned int numIvars = 0; 5 // 獲取類的所有成員變數 6 Ivar * ivars = class_copyIvarList([object class], &numIvars); 7 // 定義一個數組來接收穫取的屬性名 8 NSMutableArray *nameArray = [[NSMutableArray alloc] initWithCapacity:numIvars]; 9 for(int i = 0; i < numIvars; i++) { 10 // 得到單個的成員變數 11 Ivar thisIvar = ivars[i]; 12 // 得到這個成員變數的類型 13 const char *type = ivar_getTypeEncoding(thisIvar); 14 NSString *stringType = [NSString stringWithCString:type encoding:NSUTF8StringEncoding]; 15 // 此處判斷非object-c類型時跳過 16 if (![stringType hasPrefix:@"@"]) { 17 continue; 18 } 19 // 得到成員變數名 20 NSString *variableName = [NSString stringWithUTF8String:ivar_getName(thisIvar)]; 21 [nameArray addObject:variableName]; 22 23 // 這個函數可以得到成員變數的值 24 // object_getIvar(object, thisIvar) 25 26 } 27 free(ivars); 28 return nameArray; 29 }
調用以後,結果為:
創建方法
第一個參數為類名,第二個參數為方法名,第三個參數是函數名,第四個參數是函數的返回值和參數的類型,v表是void,@表示id,:表示SEL。更多多定義參考:SELECTOR
1 class_addMethod([kclass class], @selector(say:), (IMP)say, "v@:");
需要實現,這個方法
添加屬性
1 //添加一個屬性 2 - (void) addProperties:(Class) newClass { 3 NSString *propertyName = @"stuSex"; 4 objc_property_attribute_t type = { "T", "@\"NSString\"" }; 5 objc_property_attribute_t ownership = { "C", "copy" }; 6 objc_property_attribute_t backingivar = { "V", [propertyName UTF8String]}; 7 objc_property_attribute_t attrs[] = { type, ownership, backingivar }; 8 BOOL isOk=class_addProperty(newClass, [propertyName UTF8String], attrs, 3); 9 }
查看屬性
1 // 獲取類的所有屬性名 2 - (NSArray*)getPropertieNamesByObject:(id)object 3 { 4 5 unsigned int outCount, i; 6 7 // 獲取註冊類的屬性列表,第一個參數是類,第二個參數是接收類屬性數目的變數 8 objc_property_t *properties = class_copyPropertyList([object class], &outCount); 9 // 定義一個數組來接收穫取的屬性名 10 NSMutableArray *nameArray = [[NSMutableArray alloc] initWithCapacity:outCount]; 11 for (i = 0; i < outCount; i++) { 12 // 通過迴圈來獲取單個屬性 13 objc_property_t property = properties[i]; 14 // 取得屬性名 15 NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding]; 16 // 將得到的屬性名放入數組中 17 [nameArray addObject:propertyName]; 18 19 } 20 free(properties); 21 return nameArray; 22 }
列印結果: