2

まず、X-Code 4.3.2 バージョンと iOS 5.1 SDK があることを確認させてください。プロジェクトでコアデータ操作に使用される以下のメソッドがあります。どちらの方法でも同じ警告が表示されます。つまり、「結果の型が 'NSManagedObject <Protocol> の関数から 'NSManagedObject *' を返す互換性のないポインター型」 .

方法 A:

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

メソッドmethod 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 番目のメソッドがそのソリューションで機能しないのはなぜですか?
  2. メソッドの名前を変更することの正確な意味は何ですか。上記の警告を削除するこの適切な方法はありますか? メソッド Bで型キャストが機能しないのはなぜ ですか?

これは複雑な問題かもしれませんが、疑問がある場合は遠慮なくコメントを残してください。違いを知りたいので、少なくともコアデータについて新しいことを学ぶことができます。

4

1 に答える 1

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」型にキャストすることはできません。これは、自己が指すものです。メソッドの名前を変更しても警告が解決されるとは思いません。

于 2012-06-20T16:51:57.800 に答える