0

我正在使用运行时函数来获取属性的类型(感谢 eJames 帮助我找出这种方法)。属性的属性字符串如下所示:

T@"NSArray",&,Vstuff

我需要检查属性类型是否为数组,目前我正在这样做:

 - (BOOL)valueForKeyIsArray:(NSString *)key fromTagret:(id)target
{
    NSString *lowerCaseKey = [self convertToKVCKey:key];

    objc_property_t property = class_getProperty([target class], [lowerCaseKey UTF8String]);
    NSString *propertyAttrs = [NSString stringWithUTF8String:property_getAttributes(property)];
    NSString *encodedType = @"@\"NSArray\"";

    NSRange range = [propertyAttrs rangeOfString:encodedType options:NSLiteralSearch];
    return range.location != NSNotFound;
}

但是由于Apple可以随时更改类型定义字符串,所以我想生成这个@“NSArray”类型字符串。我用@encode() 试过了,但是没有用:

NSString *encodedType = [NSString stringWithUTF8String:@encode(NSArray *)];

那么如何生成这种类型的字符串呢?或者有没有更好的方法来检查这个属性属性是否包含数组类型?

4

2 回答 2

4

没有办法检查这一点。在 Objective-C 源代码中,被键入的变量NSArray *仅用于编译器发出警告。它没有任何意义,并且在运行时不存在。如果您将 an 错误地键入NSArrayNSString,您会在编译时收到很多警告,但您的代码在运行时的行为会完全一样。在运行时,所知道的只是 ivar/property 是“一个对象”。

另一种思考方式是,一旦编译了 Objective-C,所有对象引用都是id引用。

于 2009-05-29T10:14:21.407 回答
0

只需接受如果运行时发生更改,您的代码将中断并继续前进。NSMutableArray *但是,我认为您可能对、CFArrayRef或类型的 ivars 进行了错误分类CFMutableArrayRef。您似乎还假设所有键都直接对应于声明的属性。

最干净的解决方案可能是断言用于测试的样本对象(目标)必须具有该键的非零值,并且只需获取该值并对其进行测试[[target valueForKey:key] isKindOfClass:[NSArray class]]

于 2010-09-25T02:25:13.757 回答