当我编译项目时,x代码环境会告诉我找到了多个名为myInit ::的方法,但没有。

我创建了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代码可能在缓存的某个地方编译了旧代码吗?我尝试过Project-> Clean,但没有喜悦。

任何人都知道我如何清除此错误警告?

最佳答案

您应该真正查看Learning Objective-C: A Primer: Methods and MessagingThe 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:NSString方法。因为您使用的是未命名的参数,所以方法签名是多个类中的-myInit::,因此编译器表示不确定您的意思是什么。这就是为什么您应该确保像我建议的那样使用命名参数的更多原因。

然后初始化看起来像

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


然后,方法签名为-initWithLeftEdgeAtX:execData:,这使编译器可以更轻松地帮助预先检查您是否似乎在正确调用方法。

10-06 13:25