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;
}