多种方法警告

时间:2011-04-27 05:32:59

标签: objective-c

我目前正在学习Objective 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 个答案:

答案 0 :(得分:5)

消息的含义是翻译中有多个名称为setName:的选择器(也就是说,它至少在所有包含的头中的其他位置声明)。编译器可能会选择错误的选择器(可能会引入未定义的行为)。

您通常可以使用以下一种(或多种)方法纠正问题:

1)将方法重命名为唯一名称:例如如果不在其他翻译中使用,setExerciseName可能没问题。

2)匹配另一个选择器的签名。例如setName:(NSString *)name

3)使用类型安全:

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

4)将变量强制转换为类型:[(Exercise*)exercise setName:kCobra];

5)使用新变量恢复类型:Exercise * ex = exercise;

因为你已经将var声明为id,所以你已经删除了类型,这意味着该对象可以响应任何可见的选择器。一般情况下,除非真的有必要,否则不应以这种方式删除类型。

我看到的最佳方法是1和3的组合:

[ex setExerciseName:kCobra];