当前位置:  开发笔记 > IOS > 正文

如何在Objective-C中检测属性返回类型

如何解决《如何在Objective-C中检测属性返回类型》经验,为你挑选了2个好方法。

我在运行时在objective-c中有一个对象,我只知道KVC键,我需要检测此属性的返回值类型(例如,我需要知道它是NSArray还是NSM​​utableArray),我该怎么做呢?



1> e.James..:

你在谈论运行时属性内省,这恰好是Objective-C 非常擅长的东西.

在你描述的情况下,我假设你有一个这样的类:

@interface MyClass
{
    NSArray * stuff;
}
@property (retain) NSArray * stuff;
@end

哪个用XML编码,如下所示:


    MyClass
    stuff

从这些信息中,您希望重新创建该类,并为其提供适当的值stuff.

以下是它的外观:

#import 

// ...

Class objectClass;       // read from XML (equal to MyClass)
NSString * accessorKey;  // read from XML (equals @"stuff")

objc_property_t theProperty =
    class_getProperty(objectClass, accessorKey.UTF8String);

const char * propertyAttrs = property_getAttributes(theProperty);
// at this point, propertyAttrs is equal to: T@"NSArray",&,Vstuff
// thanks to Jason Coco for providing the correct string

// ... code to assign the property based on this information

Apple的文档(上面链接)包含了您可以期待看到的所有内容的详细信息propertyAttrs.


我对Objective-C"非常擅长"属性内省的评估提出异议.一个好的实现更类似于'propArray = [object properties]'并返回一个属性对象数组,每个属性对象都有详细描述属性的元数据.相反,我们的财产是一个神秘的'objc_property_t'.要获得它,您必须获取您的道具名称并拉出它的UTF8版本.结果描述符是一个神秘的字符串,我必须自己解析?是的,Objective-C允许你内省属性,但是我认为它的实现没什么好处.
不,不是酸葡萄.Objective-C非常明确地*没有*旨在支持这种形式的,在运行时,基于类型内省的动态行为,无论是属性还是其他运行时内省机制.正如格雷格所说,虽然出于与他所说的不同的原因,对此类的支持并不好; 这并不好,因为在设计语言或运行时*时,这种支持是特别的*不是考虑因素.
实际上,它等于T @"NSArray",&,Vstuff ;-)

2> Jim Dovey..:

便宜的答案:在这里使用NSObject + Properties源码.

它实现了上述相同的方法.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有