【问题标题】:Objective C - respondsToSelector for dynamic propertiesObjective C - 动态属性的 respondsToSelector
【发布时间】:2012-02-18 16:40:27
【问题描述】:

我目前面临检查对象(NSManagedObject)的属性是否存在的问题。

不幸的是方法

[[MyObject class] respondsToSelector:@selector(myProperty)];

总是返回 NO。

我认为是因为CoreData生成的属性是一个新的样式属性ala

@property (nonatomic, strong) NSString *myProperty

那么有什么想法可以解决这个问题吗?

非常感谢您的所有建议;)

提前致谢! 亚历克斯

【问题讨论】:

    标签: objective-c ios respondstoselector dynamic-properties


    【解决方案1】:

    我需要这样做的唯一情况是动态设置,所以我只是在寻找设置器。我只是为 setter 编写签名,然后测试它是否存在,然后使用它。

    NSArray * keys = [myObject allKeys];
    for(NSString * key in keys)
    {
        NSString * string = [NSString stringWithFormat:@"set%@:", [key capitalizedString]];
        SEL selector = NSSelectorFromString(string);
        if([myObject respondsToSelector:selector] == YES)
        {
            id object = [dict objectForKey:key];
    
            // To massage the compiler's warnings avoid performSelector
            IMP imp = [card methodForSelector:selector];
            void (*method)(id, SEL, id) = (void *)imp;
            method(myObject, selector, object);
        }
    }
    

    此代码满足您可能无法消化字典中收到的所有数据的需求。 在这种情况下,它是稀疏的 json,因此某些数据可能并不总是存在于 json 中,因此通过 myObjects 属性单步查找它们对应的键只会浪费很多精力。

    【讨论】:

      【解决方案2】:

      [[MyObject class] respondsToSelector:...] 询问元对象是否响应该选择器。因此,实际上,它询问是否存在具有该选择器的类方法。如果您有,您的代码将返回 YES:

      + (NSString *)myProperty;
      

      它返回 NO 因为你有实例方法的等价物:

      - (NSString *)myProperty;
      

      你需要在你的类的实例上调用respondsToSelector:

      您通常可以在元类上直接使用instancesRespondToSelector:(所以,[MyObject instancesRespondToSelector:...]),但 Core Data 仅在您创建对象时综合相关方法实现,所以这不是入门。但是,您可以通过普通的 NSEntityDescription 路由创建一个实例并在其上测试 respondsToSelector:

      由于都是核心数据,另一种方法是通过其entitiesByName 字典向NSManagedObjectModel 询问相关的NSEntityDescription,并检查实体描述的propertiesByName 字典。

      【讨论】:

      • 更好的答案...我会删除我的!
      • 好的,但问题是,我现在没有实例对象,我想测试这个......那么还有其他可能性吗?
      • 您通常会直接在MyObject 上使用instancesRespondToSelector:,但在这种情况下,Core Data 的内部结构使它无法启动。因此,您需要让 Core Data 为您提供一个实例,对其执行正常的respondsToSelector:,然后将对象丢弃而不是将其添加到持久存储中。
      • 或者,或者,从NSManagedObjectModel 获取NSEntityDescription 并检查其properties 数组。我正在更新我的答案以更详细地对此发表评论。
      【解决方案3】:

      你是在综合类文件中的属性吗?

      @interface SomeClass : NSObject
      {
          @property (nonatomic, strong) NSString *myProperty
      }
      @end
      
      
      @implementation SomeClass
      
          @synthesize myProperty;
      
      @end
      

      【讨论】:

      • 我使用 CoreData 生成的文件,所以道具是 @dynamically,Tommy 可以给我答案 ;)
      猜你喜欢
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 2015-01-20
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 2011-01-29
      相关资源
      最近更新 更多