0

我是 Objective-C 的新手。我有一个带有属性 {firstName, lastName, dateOfBirth} 的 'XYZPerson' 类,当我在 main 中编写“XYZPerson *person = [[XYZPerson alloc] init]”时,它应该调用我应该在-turn 调用我指定的初始化程序并使用定义的值初始化我的对象。

我的代码片段。http://pastebin.com/FfxNDDhf

#import <Foundation/Foundation.h>
#import "XYZShoutingPerson.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        XYZPerson *person=[[XYZPerson alloc] init];
        if(person) {
            [person sayHello];
        }
        else {
            NSLog(@"Person Object is NULL");
        }
    }
    return 0;
}

-(id)init
{
    self=[super init];
    return [self initWithFirstName:@"Ankit" LastName:@"Sehra" DOB:01/01/2000];
}

-(id)initWithFirstName:(NSString *)aFirstName LastName:(NSString *)aLastName DOB:(NSDate *)aDateOfBirth
{
    _firstName=aFirstName;
    _lastName=aLastName;
    _dateOfBirth=aDateOfBirth;
}

    -(void)sayHello;
{
    NSLog(@"%@ %@ %@",self.firstName,self.lastName,self.dateOfBirth);
}

现在编写程序的输出是“Person Object is NULL”,我希望它打印 firstName、lastName 和 DOB。

4

2 回答 2

1

如果一个类有多个 init 方法,其中之一就是“指定初始化器”。这是调用的那个[super initXXX]。在您的示例中,initWithFirstName:LastName:DOB:将是指定的初始化程序,应如下所示:

-(id)initWithFirstName:(NSString *)aFirstName LastName:(NSString *)aLastName DOB:(NSString *)aDateOfBirth
{
    self = [super init];
    if (self) {
        _firstName=aFirstName;
        _lastName=aLastName;
        _dateOfBirth=aDateOfBirth;
    }
    return self;
}

(我已将dateOfBirth属性的类型和DOB参数更改为NSString 并将稍后解释。)

在您的示例中,所有其他 init 方法只调用指定的初始化程序(而不是[super initXXX]init

-(id)init
{
    return [self initWithFirstName:@"Ankit" LastName:@"Sehra" DOB:@"01/01/2000"];
}

请注意(在其他几个错误中), "01/01/2000" 不是NSDate,所以

return [self initWithFirstName:@"Ankit" LastName:@"Sehra" DOB:01/01/2000];

没有任何意义。因此,为了为您获得第一个工作示例,我已将参数类型更改为NSString.

于 2013-07-21T18:26:46.443 回答
0

我敢打赌编译器会给你很多关于该代码的警告。你应该修复它们。如果不是,则您的编译器未正确调整。

首先,您指定的初始化程序不返回任何内容。

其次,没有理由重写init和调用您指定的初始化程序。只需这样做:

foo = [[Person alloc] initWithFirstName:@"bob" lastName:@"dobbs"];
于 2013-07-21T18:26:56.143 回答