Objective-C運行時庫提供了非常便利的方法獲取其對象運行時所屬類及其所有成員變量,並通過KVC進行值的存取。
在某些場合,若想遍歷某個對象的所有成員變量的值,或將其轉化為NSDictionary這樣的key-value集合,亦或將其轉化為一個網絡請求的POST參數,都可以通過OC的運行時編程來解決。
如將當前類所有成員轉化為NSDictionary集合
- (NSDictionary *)toDictionary { NSMutableDictionary *dictionaryFormat = [NSMutableDictionary dictionary]; // 取得當前類類型 Class cls = [self class]; unsigned int ivarsCnt = 0; // 獲取類成員變量列表,ivarsCnt為類成員數量 Ivar *ivars = class_copyIvarList(cls, &ivarsCnt); // 遍歷成員變量列表,其中每個變量都是Ivar類型的結構體 for (const Ivar *p = ivars; p < ivars + ivarsCnt; ++p) { Ivar const ivar = *p; // 獲取變量名 NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)]; // 若此變量未在類結構體中聲明而只聲明為Property,則變量名加前綴 '_'下划線 // 比如 @property(retain) NSString *abc;則 key == _abc; // 獲取變量值 id value = [self valueForKey:key]; // 取得變量類型 // 通過 type[0]可以判斷其具體的內置類型 const char *type = ivar_getTypeEncoding(ivar); if (value) { [dictionaryFormat setObject:value forKey:key]; } } return dictionaryFormat; }
這里是遍歷當前類的所有成員變量
還可以通過
cls = class_getSuperclass(cls);
進入父類遍歷成員變量,終止時判斷
if (cls == [NSObject class]) { return; }