Несколько методов предупреждения - PullRequest
0 голосов
/ 27 апреля 2011

В настоящее время я изучаю Цель C, и в процессе я сделал глупую небольшую программу ниже.Программа компилируется нормально - однако я получаю предупреждение "несколько методов с именем -setName: 'found".

Я только один раз подключил и реализовал метод.

Что означает это предупреждениеи как мне это исправить?

#import <Foundation/Foundation.h>

// these are the three yoga-exercises we can perform

typedef enum {
    kCobra,
    kUniversal,
    kDog
} ExerciseName;

// translating our variables into human

NSString *nameExercise (ExerciseName nameExercise)
{
    switch (nameExercise) {
        case kCobra:
            return @"Cobra Pose";
            break;
        case kUniversal:
            return @"Universal Stretch";
            break;
        case kDog:
            return @"Dog Pose";
            break;
    }

    return @"no clue!";

} // nameExercise


@interface Exercise : NSObject
{
    ExerciseName name;
}

-(void) setName: (ExerciseName) name;
-(void) exerciseDo;

@end


@implementation Exercise

-(void) setName: (ExerciseName) n {
    name = n;
} // setName

-(void) exerciseDo {
    NSLog(@"Exercise: %@",
          nameExercise(name));
}

@end


void executeExercises(id exercises[], int count) {

    int i;

    for(i=0; i<count; i++) {
        id exercise = exercises[i];
        [exercise exerciseDo];
    }
}

int main (int argc, const char * argv[]) {

    id exercises[1];

    exercises[0] = [Exercise new]; // initiating an object of class Exercise
    [exercises[0]   setName:kDog];

    executeExercises(exercises, 1);

    return 0;

} //main

1 Ответ

5 голосов
/ 27 апреля 2011

значение сообщения в том, что в переводе есть несколько селекторов с именем setName: (то есть оно объявлено, по крайней мере, в другом месте среди всех включенных заголовков). компилятор может выбрать неправильный селектор (который может привести к неопределенному поведению).

Обычно вы можете исправить проблему, используя один (или несколько) из следующих подходов:

1) переименуйте метод в уникальное имя: например, setExerciseName может быть в порядке, если не используется в других переводах.

2) совпадать с подписью другого селектора. например setName:(NSString *)name

3) используйте тип безопасности:

Exercise * ex = [Exercise new];
[ex setName:kCobra];

4) приведите переменную к типу: [(Exercise*)exercise setName:kCobra];

5) восстановить тип с новой переменной: Exercise * ex = exercise;

поскольку вы объявили переменную как id, вы удалили тип, и это означает, что объект может ответить на любой видимый селектор. как правило, вы не должны удалять тип таким способом, кроме случаев, когда это действительно необходимо.

лучший подход, который я вижу, это комбинация 1 и 3:

[ex setExerciseName:kCobra];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...