【问题标题】:NSManagedObject Incompatible pointer type warningsNSManagedObject 不兼容的指针类型警告
【发布时间】:2012-06-20 14:14:20
【问题描述】:

首先让我确定我有 X-Code 4.3.2 版本和 iOS 5.1 SDK。我的项目中有以下用于核心数据操作的方法。两种方法都给出相同的警告。即“从结果类型为'NSManagedObject ”的函数返回'NSManagedObject *'的不兼容指针类型”

方法一:

- (NSManagedObject<Protocol> *)newMOforNilMOC 
{
    return [[NSManagedObject alloc] initWithEntity:[self entityDescription] insertIntoManagedObjectContext:nil];
}

对于方法 method A 我只是进行类型转换并添加 (NSManagedObject*) 然后警告被删除,如下所述。

- (NSManagedObject<Protocol> *)newMOforNilMOC 
{
    return  (NSManagedObject<Protocol> *) [[NSManagedObject alloc] initWithEntity:[self entityDescription] insertIntoManagedObjectContext:nil];
}

方法B:

+ (NSManagedObject<Protocol> *) newInContext:(NSManagedObjectContext *)context 
    {   
        return [[NSEntityDescription insertNewObjectForEntityForName:[[(NSManagedObject<Protocol> *)self class] entityName]                                     inManagedObjectContext:context]retain]; 
    }

对于 method B,当我进行类型转换时它不起作用,因此我只需将方法的名称从 newInContext 更改为 AddnewInContext(在 google 搜索时在某处找到)然后删除警告。

我有以下问题:

  1. 如果需要第一种方法进行类型转换,那么为什么第二种方法不适用于该解决方案?
  2. 更改方法名称的确切含义是什么。这是删除上述警告的正确方法吗?为什么类型转换不起作用 方法 B

这可能很复杂,但如果您有任何疑问,请随时发表评论。因为我想知道区别,所以至少我可以学习一些关于核心数据的新东西。

【问题讨论】:

  • AddnewInContext 在做什么?
  • 它只是新的更名而已,或者它可以是别的东西。正如我上面提到的,我只是更改了方法的名称。

标签: iphone objective-c core-data ios5 nsmanagedobjectcontext


【解决方案1】:

我认为您在类方法中使用了“self”。您应该使用该类本身。让我通过代码显示

+ (NSManagedObject<Protocol> *) newInContext:(NSManagedObjectContext *)context 
{   
        //Usage of [self class] is not correct, as self points already to a class.
        NSEntityDescription* desc = [NSEntityDescription entityForName:@"myObjectName" inManagedObjectContext:context];
        return [[NSEntityDescription insertNewObjectForEntityForName:desc inManagedObjectContext:context]retain]; 
}

您不能将类类型转换为“id”类型,如果您在对象方法而不是类方法中,则 self 指向的类型。我认为任何方法重命名都不能解决任何警告。

【讨论】:

  • 仍然给出同样的警告。
  • 正如我从警告中看到的,“不兼容的指针类型从结果类型为 'NSManagedObject 的函数返回 'NSManagedObject ' ”,转换是从 NSManagedObject 到 NSManagedObject 没有 *。这可能是一个错字吗?我在您发布的方法中没有看到这一点。
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多