2

我目前正在重新开始使用一些 Objective-C。我遇到的问题是将变量传递给类实例的本机 init 方法。

我的@interface 中有这个自定义初始化:

-(id)init
{
    if(self = [super init]) {
        level = 1;
        NSLog(@"Debug response");
    }

    return ([NSObject init]); // return self;
}

这是我的应用程序的主要课程:

#import "AppDelegate.h"
#import "PlayableCharacter.h"

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    NSArray *params = [NSArray arrayWithObjects: @"Elf", nil];

    PlayableCharacter *allendar = [[PlayableCharacter alloc] init:params];
}

@end

有人可以解释我做错了什么吗?我认为 NSArray 对象将适合“id”C 对象的配置文件。提供初始化参数是非法的还是必须以其他方式完成?

错误状态:“'PlayableCharacter' 没有可见的@interface 声明选择器'init:'”

4

2 回答 2

9

您的-init方法没有任何参数。它等价于以下 C:

void *init();

void *foo = init(bar); // error

如果您想将其称为-init:,则将其声明为

- (id)init:(NSArray *)params;

然而,这是一个非常不标准的命名。如果你真的想要一个需要一个的 init 方法NSArray,那么也许将它命名为

- (id)initWithArray:(NSArray *)array;

但是从你的示例代码我猜你并不需要一个数组,你只需要一个参数。所以你会使用

- (id)initWithCharacterClass:(NSString *)className;

然后将其称为

PlayableCharacter *allendar = [[PlayableCharacter alloc] initWithCharacterClass:@"Elf"];
于 2012-12-17T22:48:30.767 回答
3

如果要使用参数进行初始化,请创建如下init方法:

-(id)initWithParams:(NSArray *)params
{
    if(self = [super init]) {
        level = 1;
        NSLog(@"Debug response");

        // Do something with params
    }

    return self;
}

另外,您应该只返回self,而不是[NSObject init]

于 2012-12-17T22:51:01.970 回答