【问题标题】:Introspection of Objective-C objects propertiesObjective-C 对象属性的自省
【发布时间】:2012-02-23 15:49:58
【问题描述】:

是否可以在不使用运行时方法的情况下以编程方式在 Objective-c 中获取对象的属性?我只是问,因为在运行时似乎没有必要检查它,而实际上它不会变化。 我正在考虑这样的事情:

MyObject *foo = [[MyObject alloc] init];
NSDictionary *propertiesNamesAndValues = [foo getAllProperties];

目前我的解决方案如下所示:

id currentClass = [MyObject class];
NSString *propertyName;
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList(currentClass, &outCount);
for (i = 0; i < outCount; i++) 
{
    objc_property_t property = properties[i];
    propertyName = [NSString stringWithCString:property_getName(property)];
    NSLog(propertyName);
    NSLog(@"%@",[foo valueForKey:propertyName]);
} 

【问题讨论】:

  • 所以你基本上想要一个名为 getAllProperties 的代码的包装器?为什么不直接将该代码添加到NSObject 的类别中?
  • NSDictionary *propertiesNamesAndValues = [foo getAllProperties]; 将在运行时执行,就像您当前的解决方案一样。就像@mattjgalloway 所说,看起来您只是在询问是否可以将该功能封装在一个方法中,答案是肯定的。

标签: objective-c ios oop introspection


【解决方案1】:

简单的答案是

根据定义,自省发生在运行时。 此外,objective-c 是一种高度动态的语言,几乎将所有内容都推迟到运行时。

在 Objective-C 中,您没有那么多用于自省的语法糖 - 您只有纯 C 运行时函数。

但是,没有什么能阻止您在 NSObject 上编写一些类别以提供更多 Objective-C'ish API,我想互联网上肯定已经有一些开源实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    相关资源
    最近更新 更多