0

私はObjective-Cの初心者です。属性 {firstName, lastName, dateOfBirth} を持つ「XYZPerson」クラスがあり、「XYZPerson *person = [[XYZPerson alloc] init]」をメインに書き込むときに、オーバーライドされた「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 メソッドがある場合、そのうちの 1 つが「指定された初期化子」です。これは を呼び出すもの[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 に答える