2012-06-20 97 views
2

讓我確保首先我有X-Code 4.3.2版本和iOS 5.1 SDK。我在我的項目中使用了以下用於核心數據操作的方法。兩種方法都提供相同的警告即「不兼容的指針類型從結果類型爲NSManagedObject <協議>」「的函數返回'NSManagedObject *'。NSManagedObject不兼容的指針類型警告

方法A:

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

對於方法方法的我只是做類型轉換,並添加(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]; 
    } 

對於B法當我做類型轉換將無法正常工作,因此我只是改變從newInContext到AddnewInContext方法的名稱(用Google搜索時發現某處)然後警告被刪除。

我有以下問題:

  1. 如果需要鑄字第一種方法,那麼爲什麼第二個不與解決方案的工作?
  2. 更改方法名稱的確切含義是什麼?這是正確的方法來消除上述警告?爲什麼類型轉換不能在 方法B

這可能很複雜,但如果您有任何疑問,請隨時發表評論。因爲我想知道其中的差異,至少我可以學習一些關於核心數據的新知識。

+0

AddnewInContext在做什麼? – DarthMike

+0

它只是新的改變的名稱無非,或者它可以是別的。正如我上面提到的,我只是改變方法的名稱。 – iMash

回答

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

表明您不能在一個類類型轉換爲「身份證」型,這是一個自我點,如果你是一個對象的方法,而不是一個類的方法中。我不認爲任何方法重命名解決任何警告。

+0

它仍然給出相同的警告。 – iMash

+0

正如我從警告中看到的:「不兼容的指針類型從結果類型爲」NSManagedObject 「的函數返回'NSManagedObject *',則演員從NSManagedObject *到NSManagedObject WITHOUT *。這可能是一個錯字嗎?我沒有看到你發佈的方法。 – DarthMike

相關問題