当我编译项目时,x-code环境告诉我有多个名为myInit :: found的方法,但没有。
我已经创建了一个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-code开发环境在实例化行上放置一个黄色三角形,报告找到的多个myInit实例。没有多个实例,代码运行正常。也许是x代码在某个缓存的地方编译了旧代码?我试过Project - >干净,但没有快乐。
任何想法如何清除这个错误的警告?
答案 0 :(得分:2)
您应该真正查看Learning Objective-C: A Primer: Methods and Messaging以及The Objective-C Programming Language: Object Messaging。
您显示的自定义init
方法具有未命名的参数,这至少可以说是奇怪的。
换句话说,如果我们在方法签名中加上一些间距,那就是:
- (id)myInit:(float)Left :(ExecData *)Exec;
第二个参数在:(ExecData *)
的冒号之前没有标签或名称。
我会考虑将方法重命名为:
- (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;
编译器正在尝试通过查看是否在实际实现该方法的对象的实例上调用方法(也就是“响应选择器”)来为您进行一些健全性检查。例如,您不希望在NSArray
的实例上调用-objectAtIndex:
的{{1}}方法。因为您使用的是未命名的参数,所以方法签名在多个类中为NSString
,因此编译器说它不确定您的意思。这就是为什么你应该确保你使用命名参数的原因,就像我建议的那样。
然后初始化看起来像
-myInit::
方法签名将是ExecSummaryControl *control= [[ExecSummaryControl alloc] initWithLeftEdgeAtX:20.0
execData:myExec];
,这使编译器更容易帮助检查您是否正在正确调用方法。