是否有一種方法可以返回符合NSKeyValueCoding協議的對象的所有密鑰?如何查找符合KVC的Objective-C對象的所有屬性鍵?
沿着[object getPropertyKeys]
的方向會返回一個NSArray的NSString對象。它適用於任何符合KVC的對象。這種方法是否存在?到目前爲止,我還沒有發現在搜索Apple文檔中的任何內容。
感謝, G.
是否有一種方法可以返回符合NSKeyValueCoding協議的對象的所有密鑰?如何查找符合KVC的Objective-C對象的所有屬性鍵?
沿着[object getPropertyKeys]
的方向會返回一個NSArray的NSString對象。它適用於任何符合KVC的對象。這種方法是否存在?到目前爲止,我還沒有發現在搜索Apple文檔中的任何內容。
感謝, G.
#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);
使用class_getPropertyList。這會告訴你對象的所有@properties
。
它不一定會列出每個符合KVC的屬性,因爲任何不帶參數並返回值的方法都是符合KVC的有效getter。運行時沒有100%可靠的方法來知道哪些行爲屬性(例如,-[NSString length]
)以及哪些行爲像命令(例如,-[NSFileHandle readDataToEndOfFile]
)。
無論如何,您應該宣佈您的KVC兼容屬性爲@properties
,所以這應該不是太大的問題。
沒有這樣的方法,因爲KVO系統不要求對象/類向它註冊它們支持KVO的屬性。 任何密鑰都可能支持KVO,唯一的方法是從作者的文檔中知道。當然,@property
不支持KVO;但是,編寫一個不屬於(也可能有時需要)的屬性是很有可能的。所以,在我看來,獲得班級名單@property
s,然後假設他們符合KVO將是一個危險的選擇。
您需要一個getPropertyType函數。看到這個帖子:Get an object attributes list in Objective-C
環境:Xcode7.2,iOS9.2
我用下面的代碼片段來獲得指定類的屬性名稱,它工作正常:
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);
爲什麼有人改變這種情況?我很想知道他們認爲是錯的。 – 2009-04-23 12:22:02
因爲有錯誤的答案。在編輯之前)) – oxigen 2009-04-23 12:53:46