属性类型与访问者类型不匹配

时间:2014-07-26 15:05:08

标签: ios objective-c xcode ios8 xcode6

使用Xcode 6 Beta 4,定位iOS 8:

我一起使用核心数据和Mogenerator。如果您不熟悉" Mogen",请跳到底部。当Mogen为实体生成NSManagedObject子类时,它会执行以下操作:

@interface MyEntityID : NSManagedObjectID {}
@end

@interface _MyEntity : NSManagedObject {}

- (MyEntityID*)objectID;

----------------------------------------------------------------------------

@implementation _MyEntity

- (KJMWorkoutID*)objectID {
    return (KJMWorkoutID*)[super objectID];
}

我猜它有点方便。 NSManagedObject有一个objectID属性,所有_MyEntity正在做的就是覆盖它的getter来返回一个MyEntityID,以便我们可以告诉它一个专门用于我们_MyEntityClass的ID。

所以,回到我的问题。我想通过检查它们不相等来比较两个MyEntityID:

if (![self.objectID isEqual:self.previousID])

我收到了这个警告:

Type of property 'objectID' does not match type of accessor 'objectID'

好的,我知道该属性是NSManagedObjectID,但我们正在调用Mogen编写的访问器方法,该方法返回MyEnytityID。即使代码完成也能识别这一点。

如何看到NSManagedObject的objectID的NSManagedObjectID属性类型? 我应该以某种方式沉默警告吗? 它可能只是一个Xcode 6 Beta的东西吗? (它不会发生在Xcode 5中)

Mogen:

Mogen只是一个有用的工具,可以为您的数据模型实体生成NSManagedObject的子类。它有点像Xcode所做的那样,但是每次重新生成子类时都不会删除你编写的任何自定义代码,它会为你提供一大堆很好的方法来创建新的实体等。如果底栏上带有前缀类名称的东西,那么你也有新的东西,这就是Mogen停止覆盖你编写的任何自定义代码的方式。

2 个答案:

答案 0 :(得分:38)

这个问题与Xcode 6 beta版本无关,但是由于在iOS 8中objectID的声明发生了变化。直到iOS 7,它被声明为 实例方法

- (NSManagedObjectID *)objectID;

从iOS 8 / OS X 10.10开始,它被声明为只读属性

@property (nonatomic, readonly, strong) NSManagedObjectID *objectID;

https://stackoverflow.com/a/7086119/1187415中所述,您可以覆盖 子类中的实例方法,其方法具有更专业的返回值, 在这种情况下

- (MyEntityID *)objectID;

但是使用更专业的返回值覆盖属性似乎有问题 (并且这样做会导致与Xcode 5相同的警告。)

以下似乎适用于“旧”和“新”SDK: 在“_MyEntity.h”中,替换

- (MyEntityID*)objectID;

通过

@property (nonatomic, readonly, strong) MyEntityID *objectID;

并在“_MyEntity.m”中删除- (MyEntityID*)objectID方法并添加

@dynamic objectID;

但是,这些文件总是由Mogenerator重新创建,所以这不是一个 满意的解决方案。 我建议向Mogenerator人员提交错误报告以找到解决方案 与iOS 8 / OS X 10.10 SDK兼容。

我找不到编译器选项来抑制此警告(它没有标记 “-W ...”以便“-Wno ...”选项可以抑制它。

作为解决方法,您可以将self.objectID替换为[self objectID], 不要引起警告。

答案 1 :(得分:3)

@Martin R的答案是正确的,但对于那些从现在到此的人来说,Mogenerator已更新为v1.28并解决了这个问题。