2011-10-10 89 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找到我的脚。我很感激这个建议。 –