OC 反射-->動態建立類,oc--

來源:互聯網
上載者:User

OC 反射-->動態建立類,oc--

 

建立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 //新增成員變數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 }

 

 

列印結果:

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.