24

是否有一種方法可以返回符合NSKeyValueCoding協議的對象的所有密鑰?如何查找符合KVC的Objective-C對象的所有屬性鍵?

沿着[object getPropertyKeys]的方向會返回一個NSArray的NSString對象。它適用於任何符合KVC的對象。這種方法是否存在?到目前爲止,我還沒有發現在搜索Apple文檔中的任何內容。

感謝, G.

回答

33
#import "objc/runtime.h" 

unsigned int outCount, i; 

objc_property_t *properties = class_copyPropertyList([self class], &outCount); 
for(i = 0; i < outCount; i++) { 
    objc_property_t property = properties[i]; 
    const char *propName = property_getName(property); 
    if(propName) { 
      const char *propType = getPropertyType(property); 
      NSString *propertyName = [NSString stringWithUTF8String:propName]; 
      NSString *propertyType = [NSString stringWithUTF8String:propType]; 
    } 
} 
free(properties); 
+0

爲什麼有人改變這種情況?我很想知道他們認爲是錯的。 – 2009-04-23 12:22:02

+0

因爲有錯誤的答案。在編輯之前)) – oxigen 2009-04-23 12:53:46

3

使用class_getPropertyList。這會告訴你對象的所有@properties

它不一定會列出每個符合KVC的屬性,因爲任何不帶參數並返回值的方法都是符合KVC的有效getter。運行時沒有100%可靠的方法來知道哪些行爲屬性(例如,-[NSString length])以及哪些行爲像命令(例如,-[NSFileHandle readDataToEndOfFile])。

無論如何,您應該宣佈您的KVC兼容屬性爲@properties,所以這應該不是太大的問題。

1

沒有這樣的方法,因爲KVO系統不要求對象/類向它註冊它們支持KVO的屬性。 任何密鑰都可能支持KVO,唯一的方法是從作者的文檔中知道。當然,@property不支持KVO;但是,編寫一個不屬於(也可能有時需要)的屬性是很有可能的。所以,在我看來,獲得班級名單@propertys,然後假設他們符合KVO將是一個危險的選擇。

0

環境:Xcode7.2,iOS9.2

我用下面的代碼片段來獲得指定類的屬性名稱,它工作正常:

進口「objc /運行。 h「

unsigned int outCount, i; 

objc_property_t *properties = class_copyPropertyList([SNBankBean class], &outCount); 
for(i = 0; i < outCount; i++) { 
    objc_property_t property = properties[i]; 
    const char *propName = property_getName(property); 
    if(propName) { 
     NSString *propertyName = [NSString stringWithUTF8String:propName]; 
     NSLog(@"the property name is %@",propertyName); 
     if ([propertyName isEqualToString:bank_name]) { 
      self.isBankExisted=YES; 
     } 
    } 
} 
free(properties); 
相關問題