2009-07-16 54 views
3

我已經定義了一個init方法爲:對象 - 分配警告使用init方法

- (id)initWithX:(float)inX AndY:(float)inY 
{ 
    if (self = [super init]) 
    { 
     [self setX:inX andY:inY]; 
    } 

    return self;  
} 

當我用這個方法是這樣的:

MyObject* myObject = [[MyObject alloc] initWithX:0.0 AndY:0.0]; 

我得到警告說:「警告:從不同的Objective-C類型初始化「

但有趣的是,如果我在方法簽名中將」AndY:「更改爲」andY:「,則警告消失。

爲什麼會發生這種情況?當然,我的方法的命名不應該影響它的返回類型?


經過多一點調查,更改方法名稱使用小寫字母'和Y'沒有使警告消失。我清理了所有的目標,並重建並且警告沒有顯示。但它在重新編譯之後又回來了。奇。

回答

1

這裏似乎還有其他工作,我不完全確定是什麼。

我讀了可可準則和命名方法的主題,它說不使用和鏈接關鍵字,感謝Toon Van Acker的鏈接。

我刪除了「andY:」,只是換成「y:」,並且警告消失了,無論我做了多少次清理和重建。

我仍然不明白爲什麼這會導致編譯器發出警告。即使它違背命名方法的指導方針,方法簽名匹配的標題和實現...

2

您是否在.h文件中用小寫「和」聲明它?

4

這沒有完整的代碼上下文有點模糊,但我會盡力回答你的問題。

方法選擇器的命名不應該影響其返回類型。但是,如果方法名稱不匹配(例如,它在@interface中稱爲-initWithX:和Y:,而在@implementation中稱爲-initWithX:AndY:),則可能會遇到奇怪的問題。順便提一句,多部分選擇器的Cocoa約定是用小寫字母開始每個片段。

+2

另外,顯然,蘋果的編碼準則從使用「和」連接參數在和Y:(int)intY 「請勿使用」和「鏈接屬於接收器屬性的關鍵字」。 http://developer.apple.com/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html – 2009-07-16 22:33:33

+0

非常好的一點!我已經忘記了這一點,但這是很好的建議。 – 2009-07-17 00:52:09

2

和其他人一樣,我懷疑你已經在類接口定義(@interface塊,可能在.h文件中)和方法實現(在@implementation塊中)中以不同方式命名方法。當Objective-C編譯器遇到未知方法時,它假定輸入參數類型爲id(對象引用)。所以,當它遇到使用AndY:命名的方法時,它不能識別該方法(選擇器區分大小寫)並假定輸入應該是id。由於您傳遞的是float類型的輸入,因此會收到警告。顯然,當方法被識別並且編譯器知道輸入是float時,您不會收到警告。

1

我懷疑如果你錯誤地命名了方法,你會得到一個不同的警告(initWithX:AndY:找不到方法)。

頭文件返回的聲明是什麼?聲明該方法爲

- (NSObject*)initWithX:(float)inX AndY:(float)inY;

例如,會給你這個警告。