【问题标题】:How to determine whether subclass of NSManagedObject has a particular property at runtime如何在运行时判断 NSManagedObject 的子类是否具有特定属性
【发布时间】:2011-02-08 18:00:59
【问题描述】:

我习惯于在运行时使用doesRespondToSelector:instancesRespondToSelector: 来确定对象是否具有某些可用的方法。但是,在使用 Core Data 时,我没有看到 @dynamic 属性的预期行为。例如,如果我的类上有一个sortOrder 属性,我可以使用Objective-C 运行时查看该属性在运行时是否存在。但是如果我询问相关的Class 对象是否instancesRespondToSelector:,我会回复NO。如果我使用运行时枚举可用的方法,我的动态 getter/setter 都不会出现在列表中,这是一致的,但不是我所期望的。

那么,我的问题是:在不使用运行时检查的情况下,是否有一种简单的方法可以确定 NSManagedObject 子类的实例是否响应与其 @dynamic 属性对应的 getter/setter 选择器?

【问题讨论】:

    标签: objective-c properties selector


    【解决方案1】:

    您可以通过 NSEntityDescription 检查 NSManagmentObject:

    - (BOOL)hasPropertyWithName:(NSString *)name
    {
        NSEntityDescription *desc = self.entity;
        return [desc.attributesByName objectForKey:name] != nil;
    }
    

    【讨论】:

      【解决方案2】:

      我在NSManagedObject 对象上使用了以下方法来检索它的属性列表。也许它会为你指明正确的方向......

      - (NSMutableArray *) propertyNames: (Class) class { 
          NSMutableArray *propertyNames = [[NSMutableArray alloc] init];
          unsigned int propertyCount = 0;
          objc_property_t *properties = class_copyPropertyList(class, &propertyCount);
      
          for (unsigned int i = 0; i < propertyCount; ++i) {
              objc_property_t property = properties[i];
              const char * name = property_getName(property);
              [propertyNames addObject:[NSString stringWithUTF8String:name]];
          }
          free(properties);
          return [propertyNames autorelease];
      }
      

      【讨论】:

      • 我只是对一个完全逐行执行的方法进行最后润色,按照您的建议。它非常昂贵,但它可以完成工作。感谢您肯定我的做法。
      • @warrenm 我很少需要调用它,所以我没有注意到费用。也许您可以将结果缓存到磁盘,只要确保在更新数据模型时清除该缓存即可。很高兴能提供帮助。
      • 哦,当然。我也很少调用它,否则会酌情缓存。我只是注意到这是测试单个属性的一种相当严厉的方法。
      猜你喜欢
      • 1970-01-01
      • 2012-01-14
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      相关资源
      最近更新 更多