代码之家  ›  专栏  ›  技术社区  ›  Enyra

如何使用@encode()在Objective-C中获取@NSArray

  •  0
  • Enyra  · 技术社区  · 16 年前

    我使用运行时函数来获取属性的类型(感谢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 *)];
    

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

    2 回复  |  直到 16 年前
        1
  •  4
  •   Monolo    13 年前

    没有办法检查这个在Objective-C源代码中,变量类型为 NSArray * 只允许编译器发出警告它没有意义,在运行时不存在。如果你打错了 NSArray 作为 NSString ,编译时会收到很多警告,但运行时代码的行为将完全相同在运行时,所有已知的是ivar/属性是“一个对象”。

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

        2
  •  0
  •   Jeremy W. Sherman    15 年前

    只要接受这样一个事实:如果运行时发生更改,代码将中断并继续运行不过,我认为你可能会把ivar分为 NSMutableArray * , CFArrayRef ,或 CFMutableArrayRef . 您似乎还假设所有键都直接对应于声明的属性。

    最干净的解决方案可能是断言用于测试的示例对象(目标)必须具有该键的非nil值,然后获取该值并测试 [[target valueForKey:key] isKindOfClass:[NSArray class]] .