2

そのため、Apple の Objective-C のドキュメントを調べています (iPhone の開発に入る前に)。演習の 1 つは、指定された初期化子 (3 つのパラメーターを使用) と適切なファクトリ メソッドを作成する必要があると述べています。

今、私は自分の理解に基づいてこれを行いましたが、実装内で alloc と init を使用する必要があるかどうかわからないため、ファクトリ メソッドを実装できませんか?

エクササイズ:

指定された名、姓、生年月日、および適切なクラス ファクトリ メソッドを使用して、XYZPerson を作成するために使用される新しい指定イニシャライザを宣言および実装します。init をオーバーライドして、指定されたイニシャライザを呼び出すことを忘れないでください。

コード:

//.h 

-(id)initWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *) dob;

//.m
-(id)initWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *)dob{
    self = [super init];
    return [self initWithNameAndDob:fName last:lName birth:dob];
}

実装に欠けているものはありますか?

ありがとうございました、

4

2 に答える 2

16

指定された名、姓、生年月日を使用して XYZPerson を作成するために使用される新しい指定イニシャライザを宣言して実装します...

宣言は正しいですが、それ自体を呼び出しているため、実装は再帰的です。次のようなことをします

//.h
-(id)initWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *) dob;
//.m
-(id)initWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *)dob{
    if(self = [super init]) {
        // use the parameters to do something, eg.
        _fName = fName; // assuming you have an ivar called _fName 
        _lName = lName; // assuming you have an ivar called _lName
        _dob = dob; // assuming you have an ivar called _dob
    }
    return self;
}

それで

...適切なクラス ファクトリ メソッドと共に。

ファクトリ メソッドは、オブジェクトのインスタンスを生成するクラス メソッドです。最も一般的な実装は、オブジェクトの新しいインスタンスを割り当てて初期化し、それを返すようにすることです。

//.h
+(instancetype)personWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *) dob {


//.m
+(instancetype)personWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *) dob {
return [[XYZPerson alloc] initWithNameAndDob:fName last:lName birth:dob];
}

ついに

init をオーバーライドして、指定されたイニシャライザを呼び出すことを忘れないでください。

設計された初期化子はinitWithNameAndDob:last:birth:実装initで呼び出す必要があるためです。設計されたイニシャライザのパラメータは、適切なデフォルトである必要があります。この場合nilは問題ありません。

-(id)init {
     return [self initWithNameAndDob:nil last:nil birth:nil];
 }

最後の発言として、イニシャライザの命名規則があまり良くないことを指摘したいと思います。より適切で読みやすいものは

-(id)initWithFirstName:(NSString *)fName lastName:(NSString *)lName dateOfBirth:(NSDate *) dob;
于 2012-12-30T16:21:30.770 に答える
5

Gabriele Petronella による優れた説明ですが、問題があります。

+(instancetype)personWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *) dob {
return [[XYZPerson alloc] initWithNameAndDob:fName last:lName birth:dob];
}

It should be replaced with 
+(instancetype)personWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *) dob {
return [[self alloc] initWithNameAndDob:fName last:lName birth:dob];
}

規則: 具体的なクラスがどうなるかわからないため、独自のクラスを名前で参照しないでください。サブクラス化によってクラスを拡張およびオーバーライドする機能をうっかり切り落としてしまいます。代わりに、クラスのファクトリ メソッドでインスタンスを割り当てるには: [self alloc] 参照: http://qualitycoding.org/factory-method/

于 2014-12-04T08:07:20.130 に答える