2

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

方法一:

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

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

- (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]; 
    }

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

我有以下问题:

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

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

4

1 回答 1

1

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

+ (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 指向的类型。我认为任何方法重命名都不能解决任何警告。

于 2012-06-20T16:51:57.800 回答