2009-04-24 41 views
0

我正在使用运行时功能来获取属性的类型(感谢eJames帮助我找出这种方式)。 属性的属性字符串看起来是这样的:如何使用@encode()获取@“NSArray”Objective-C

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; 
} 

但由于苹果可以随时更改的类型定义字符串,我想产生这种@“的NSArray”字符串类型。我试过用@encode(),但它没有工作:

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

那么我怎样才能生成这种类型的字符串?还是有更好的方法来检查这个属性是否包含数组类型?

+0

没有人有想法吗? – Enyra 2009-04-24 14:17:33

回答

4

没有办法检查这个。在Objective-C源代码中,键入为NSArray *的变量仅用于编译器发出警告。它没有意义,并且在运行时不存在。如果您错误地输入NSArray作为NSString,编译时会收到很多警告,但运行时代码的行为完全相同。在运行时,所有已知的是,ivar /属性是“一个对象”。

另一种想法是,一旦Objective-C被编译,所有的对象引用都是id引用。

+0

其实你是对的,对象引用在运行时是“id”,但这对我来说并不重要。测试适用于我和我的问题是,我怎么能生成这个@“NSArray”类型的字符串,因为我不想对它进行硬编码。 – Enyra 2009-06-02 08:15:24

0

只要接受,如果运行时更改,您的代码将中断,并继续前进。不过,我认为你可能会误将NSMutableArray *CFArrayRefCFMutableArrayRef类型的ivars分类。你似乎也假设所有的键直接对应一个声明的属性。

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