2011-02-25 62 views
2

我有這個類:不兼容的指針t型

@interface G2Matrix : NSObject 

... 
- (id) initWithArray:(float *)val; 
... 

@end 

這條線之下給我一個警告說,第一個參數方法initWithArray有不兼容的指針類型:

float m[16]; 
... 
G2Matrix* matrix = [[[G2Matrix alloc] initWithArray:m] autorelease]; 

如果我將方法名稱更改爲像initWithArray1這樣的警告消失。我知道基礎類中的一些對象有一個名稱相同的方法,但是我從NSObject派生,它沒有這個方法。是什麼賦予了?

附加信息 - 我從G2Matrix類中的其他init方法調用相同的initWithArray方法,但是在那裏我看不到警告。

+1

[This answer](http://stackoverflow.com/questions/3671097/why-is-this-pointer-type-in​​compatible/3671255#3671255)解釋了發生了什麼事以及如何避免警告。 – Anna 2011-02-25 04:12:20

+0

是的,這甚至是與我在那裏的答案一樣導致問題的方法。 – Chuck 2011-02-25 04:28:17

回答

3

在猜測,這是一個類型的問題:

裏面的其他初始化方法,你叫[self initWithArray:...]self被鍵入爲G2Matrix*。在這種情況下,編譯器可以完全解決哪個imp(C函數指針)最終將處理方法調用,並正確檢測其簽名(參數和返回類型)。

在常規代碼中,[G2Matrix alloc]返回id。在這種情況下,編譯器只能告訴方法選擇器,它將在運行時綁定到imp。它必須猜測你的意思是哪一個,並且你可以從它猜到的警告中看到,因爲基礎類具有不同簽名的initWithArray:方法。你的代碼仍然工作,編譯器不能確定。

爲initMethod選擇一個唯一名稱(initWithFloats:也許?)是關閉警告的推薦方法。其他方法是:將其分成兩行;或ALLOC返回值轉換成正確的類:

G2Matrix *matrix = [G2Matrix alloc]; 
matrix = [[matrix initWithArray:pointerToFloats] autorelease]; 
// or 
G2Matrix* matrix = [[(G2Matrix *)[G2Matrix alloc] initWithArray:m] autorelease]; 

看上去有些奇怪,但可以讓你把請客的警告-AS-錯誤編譯器標誌回來。

+0

感謝您的好解釋,以及對'正確'方法名稱的建議 - 'initWithFloats'聽起來更正確! – tathagata 2011-02-26 15:49:10

0

@tathagata這是因爲initWithArray是在NSArray類中定義的方法,所以除非子類NSArray類,否則不能使用它。

看到的NSArray

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html

PS的文檔。 通過使用該方法,我的意思是覆蓋現有的方法爲您的目的,這不是一個好主意,你可以在文檔中找到子類註釋。

+3

這不是真的。使用另一種方法共享選擇器的方法通常不存在問題。如果這些方法具有不同的簽名(這是因爲編譯器需要知道簽名以生成正確的代碼,並且只有在知道該對象的類型時才能這樣做),這對於不同的init方法來說是一個特別糟糕的主意簽名(因爲'alloc'總是返回一個不確定類型的對象)。 – Chuck 2011-02-25 04:22:04

+0

酷我不知道,謝謝 – Robin 2011-02-25 04:58:48

+0

@Chuck + 1,你是正確的,只要簽名也是一樣的,只有一個名字相同的方法纔有意義。 – tathagata 2011-02-26 15:51:44