2011-10-10 84 views
0

當我編譯我的項目時,x-code環境告訴我有多個名爲myInit :: found的方法,但是沒有。xcode 4.1黃色三角形?

我已經創建了UIControl的子類,並且想要自定義的初始化程序。我稱之爲myInit,定義如下:

- (id)myInit:(float)Left:(ExecData *)Exec 
{ 
    self = [super initWithFrame:CGRectMake(Left, 0.0, 120.0, 200.0)]; 

    if (self) 
    {   
     exec = Exec; 
     [self initialise]; // another method 
    } 

    return self; 
} 

我的類被稱爲ExecSummaryControl。因此,爲了實例化基於此類的對象,我鍵入:

ExecSummaryControl *control = [[ExecSummaryControl alloc]myInit:20.0:myExec]; 

其中myExec是ExecData類型的對象。

它一切正常,但x代碼開發環境對實例化行放置一個黃色三角形,報告找到myInit的多個實例。沒有多個實例,代碼運行良好。 x-code是否可以將舊代碼編譯到緩存的地方?我已經嘗試過項目 - >清潔,但沒有喜悅。

任何任何想法如何我可以清除這個錯誤的警告?

+0

如果將myInit的名稱更改爲其他名稱,會發生什麼情況。 – bryanmac

回答

2

你應該看看Learning Objective-C: A Primer: Methods and Messaging以及The Objective-C Programming Language: Object Messaging

您所定製的init方法具有未命名的參數,這是很奇怪的。

換句話說,如果我們把一些空間在你的方法簽名,是一個由:(ExecData *)冒號前

- (id)myInit:(float)Left :(ExecData *)Exec; 

第二個參數沒有標籤或名稱。 我會考慮重新命名的方法是這樣的:

- (id)initWithLeftEdgeAtX:(CGFloat)left execData:(ExecData *)anExecData 
{ 
    self = [super initWithFrame:CGRectMake(left, 0.0, 120.0, 200.0)]; 

    if (self) 
    {   
     exec = anExecData; 
     [self initialise]; // another method 
    } 

    return self; 
} 

你得到的是從編譯器警告是因爲你可能在你的項目中的其他類,也有-myInit::方法也有不願透露姓名的原因參數,如下列:

- (id)myInit:(NSString *)someString :(SomeClass *)anUnnamedParameter; 

編譯器試圖如果你在實際實現方法的對象的實例調用方法看爲你做一些理智檢查(又名「響應選擇器「)。例如,您不希望在NSString的實例上調用NSArray-objectAtIndex:方法。由於您使用的是未命名的參數,因此方法簽名爲多於一個類的-myInit::,因此編譯器說它不確定您的意思。這就是爲什麼你應該確保你使用了命名參數的原因。

然後初始化會是什麼樣

ExecSummaryControl *control= [[ExecSummaryControl alloc] initWithLeftEdgeAtX:20.0 
                   execData:myExec]; 

方法簽名將被-initWithLeftEdgeAtX:execData:,這使得它更容易爲編譯器,以幫助檢查前期是否會得到適當的調用方法。

+0

對不起,我是C#開發人員,仍然試圖用obj-c找到我的腳。我很感激這個建議。 –