xcode 4.1 желтые треугольники? - PullRequest
0 голосов
/ 10 октября 2011

Когда я компилирую свой проект, среда 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-Среда разработки кода помещает желтый треугольник в строку создания экземпляра, сообщая о множественных найденных экземплярах myInit.Нет нескольких экземпляров, и код работает нормально.Возможно ли, что x-code скомпилировал старый код где-то в кеше?Я пытался спроецировать -> очистить, но без радости.

У кого-нибудь есть идеи, как мне убрать это ошибочное предупреждение?

1 Ответ

2 голосов
/ 10 октября 2011

Вы действительно должны просмотреть Обучение 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:, что упростит компилятору предварительную проверку того, что вы вызываете методы.должным образом.

...