加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ios – 属性类型与访问者的类型不匹配

发布时间:2020-12-15 01:53:41 所属栏目:百科 来源:网络整理
导读:使用Xcode 6 Beta 4,针对iOS 8: 我一起使用Core Data和Mogenerator。如果你不熟悉“Mogen”,请跳到底部。当Mogen生成一个实体的NSManagedObject子类时,它执行以下操作: @interface MyEntityID : NSManagedObjectID {}@end@interface _MyEntity : NSMana
使用Xcode 6 Beta 4,针对iOS 8:

我一起使用Core Data和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,以便我们可以告诉它是一个ID为我们的_MyEntityClass的ID。

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

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

我得到这个警告:

属性“objectID”的类型与访问器“objectID”的类型不匹配

好的,我明白属性是NSManagedObjectID,但是我们正在调用Mogen写入的访问器方法返回MyEnytityID。即使代码完成也能识别出来。

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

什么是Mogen

Mogen只是为您的数据模型实体生成NSManagedObject的子类的有用工具。它有点像Xcode,但不会清除您每次重新生成子类时编写的任何自定义代码,并为您提供了一系列用于创建新实体的好方法。如果下面的条带前缀类名字还有一些新的东西,这只是Mogen停止自己覆盖你写的任何自定义代码的方式。

解决方法

问题与Xcode 6 beta版本无关,但由于在iOS 8中声明objectID改变了这一事实。直到iOS 7,它被宣布为
实例方法:

- (NSManagedObjectID *)objectID;

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

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

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

- (MyEntityID *)objectID;

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

以下内容似乎与“旧”和“新”SDK兼容:
在“_MyEntity.h”中,替换

- (MyEntityID*)objectID;

通过

@property (nonatomic,strong) MyEntityID *objectID;

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

@dynamic objectID;

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

我找不到编译器选项来禁止这个警告(没有标记
“-W …”,以便“-Wno …”选项会抑制它。

作为解决方法,您可以通过[self objectID]替换self.objectID,这是不会引起警告。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读