使用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停止覆盖你编写的任何自定义代码的方式。
答案 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并解决了这个问题。