rvi*_*007 6 objective-c objective-c-runtime nsobject ios8
我试图检索我的类或其任何子类定义的所有属性的列表.以下代码片段是我一直使用的代码,它一直正常工作,直到最近的iOS8 beta 4.
if(!dictionary) {
dictionary = [NSMutableDictionary dictionary];
// Get all properties we have until we hit CBLNestedModel
while(klass != [CBLNestedModel class]) {
unsigned count;
objc_property_t* properties = class_copyPropertyList(klass, &count);
for (unsigned i = 0; i < count; i++) {
objc_property_t property = properties[i];
const char* propertyNameC = property_getName(property);
NSString* propertyName = [NSString stringWithUTF8String:propertyNameC];
const char* propertyAttrC = property_getAttributes(property);
NSString* propertyAttrS = [NSString stringWithUTF8String:propertyAttrC];
NSArray* propertyAttr = [propertyAttrS componentsSeparatedByString:@","];
NSLog(@"%@ has property %@", NSStringFromClass(klass), propertyName);
dictionary[propertyName] = propertyAttr;
}
free(properties);
klass = [klass superclass];
}
propertyDictionary[klassString] = dictionary;
}
Run Code Online (Sandbox Code Playgroud)
CBLNestedModel派生自NSObject.基本上,我想要CBLNestedModel的任何子类声明的所有属性,或者它的子类.我面临的问题是,现在,这段代码返回了我的子类中未定义的无关属性.@"superclass", @"description", @"debugDescription", @"hash"对于某些类,propertyNames会返回,即使我从未在子类中的任何位置定义过这些属性.
奇怪的是,对于CBLNestedModel的所有子类,不返回这些无关的属性,但仅针对某些子类.但是,在我的应用程序的每次运行中,它们都将可靠地返回给那些子类.
知道为什么会这样吗?
您的CBLNestedModel子类是否遵循任何协议?我以前看到类似的问题与对象我,无法找出原因hash,description,superclass,并debugDescription分别显示出来,我终于想通了.这就是我的所作所为:
@interface FOOObject : NSObject<NSCopying, FOOOtherProtocol>
Run Code Online (Sandbox Code Playgroud)
看起来很好,它是一个直接的子类NSObject.事实上,我有其他对象来测试它,一个具有属性,一个没有.
@interface FOOObjectWithProperties : NSObject
@property NSString *someProperty;
@end
Run Code Online (Sandbox Code Playgroud)
和
@interface FOOObjectWithoutProperties : NSObject
@end
Run Code Online (Sandbox Code Playgroud)
在测试过程中FOOObjectWithProperties和FOOObjectWithoutProperties两人都没有具备上述四个NSObject特性包括,但原来的FOOObject DID.
那有什么区别?好好看NSCopying它似乎没有添加任何属性,所以我看了一下FOOOtherProtocol,我已经实现了一些协议,它也没有声明任何属性.
然而
看看声明FOOOtherProtocol:
@protocol FOOOtherProtocol<NSObject>
Run Code Online (Sandbox Code Playgroud)
它就是.Objective-C的运行时的东西确实不包括在返回什么但是它将包括在协议扩展(即强制遵守其他协议的协议)声明的属性超性能.
注意不谈hash,description,superclass,和debugDescription?
查看它们在NSObject协议声明中声明的位置
NSObject从子类的协议中删除强制协议依从性(因为它们是NSObject的子类,无论如何已经遵守它),你应该看到这些属性消失了.