Вы действительно должны просмотреть Обучение Objective-C: Учебник для начинающих: методы и обмен сообщениями , а также Язык программирования Objective-C: Обмен сообщениями объектов .
Ваш пользовательский init
метод, как показано, имеет безымянные параметры, что, по меньшей мере, странно, если не сказать больше.
Другими словами, если мы добавим некоторый интервал в сигнатуру вашего метода, это будет:1011 *
Второй параметр не имеет метки или имени перед двоеточием :(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:
, что упростит компилятору предварительную проверку того, что вы вызываете методы.должным образом.