如何确定Objective-C属性的类别?

如何确定Objective-C属性的类别?,objective-c,properties,Objective C,Properties,好,假设我有一个类的属性: @interface MyObject : NSObject { MyOtherObject *someOtherObject; } @property (nonatomic, copy) MyOtherObject *someOtherObject; @end 我试图创建一些东西,将API响应反序列化到正确的对象中,而不显式定义每个API属性映射到的类。那么,有没有办法让我知道a类属性是什么,即使它是nil?我要寻找的是像[MyObject class

好,假设我有一个类的属性:

@interface MyObject : NSObject {
    MyOtherObject *someOtherObject;
}

@property (nonatomic, copy) MyOtherObject *someOtherObject;

@end
我试图创建一些东西,将API响应反序列化到正确的对象中,而不显式定义每个API属性映射到的类。那么,有没有办法让我知道a类属性是什么,即使它是
nil
?我要寻找的是像
[MyObject classForProperty:@“someOtherObject”]
这样的方法,它将返回一个
对象。注意——我不是在寻找类:的
类型,也不是只寻找类
,因为它们对
nil
值不起作用


最糟糕的情况是,我可以手动定义一个属性类列表,但如果有一些内置的方法来实现这一点,那就太好了。

好的,在遇到这个问题后,我终于明白了这一点:

代码如下:

@interface NSObject (Properties)

+ (Class)classForProperty:(NSString *)propertyName;

@end

#import <objc/runtime.h>

@implementation NSObject (Properties)

+ (Class)classForProperty:(NSString *)propertyName {
    const char *attributes = property_getAttributes(class_getProperty([self class], [propertyName UTF8String]));
    NSString *attributesString = [NSString stringWithUTF8String:attributes];
    NSArray *parts = [attributesString componentsSeparatedByString:@","];
    NSString *typeString = [[parts objectAtIndex:0] substringFromIndex:1];

    if ([typeString hasPrefix:@"@"] && [typeString length] > 1) {
        NSString *name = [typeString substringWithRange:NSMakeRange(2, [typeString length]-3)];
        Class theClass = NSClassFromString(name);
        return theClass;
    }

    return nil;
}

@end
@接口对象(属性)
+(Class)classForProperty:(NSString*)propertyName;
@结束
#进口
@实现对象(属性)
+(类)classForProperty:(NSString*)propertyName{
const char*attributes=property\u getAttributes(class\u getProperty([self class],[propertyName UTF8String]);
NSString*AttributeString=[NSString stringWithUTF8String:attributes];
NSArray*parts=[属性字符串组件由字符串分隔:@“,”];
NSString*typeString=[[parts objectAtIndex:0]substringFromIndex:1];
如果([typeString hasPrefix:@“@”]&&[typeString length]>1){
NSString*name=[typeString substringWithRange:NSMakeRange(2[typeString长度]-3)];
Class theClass=NSClassFromString(名称);
返回类;
}
返回零;
}
@结束

这对我来说似乎很有效,但任何修改都是绝对欢迎的。

EWW。。。你真的不想那样做。
@property
类型编码字符串非常脆弱,在未来的编译器中可能会发生更改,通常不鼓励使用这种编码模式。创建自己的模型描述层(或使用核心数据)要好得多。为什么不直接使用键值编码进行反序列化呢?嗯——很高兴知道,也许我最终会手动使模型描述更紧张——除非我遗漏了什么,否则您仍然无法确定属性的类别,对吗?