5

私はObjective-Cにかなり慣れていないので、質問があります。

カスタムクラスを作成し、初期化用のオーバーロードを作成しようとしました。

- (id)init
{
    if (self = [super init]) {
        [self setIsCurrentCar:NO];
    }
    return self;
}

-(id) initWithID:(NSInteger)id {
    if(self = [self init]) {
        [self setID:id];
    }
    return self;
}

-(id) initWithID:(NSInteger)id CarYear:(NSString *)year {
    if(self = [self initWithID:id]) {
        [self setCarYear:year];
    }
    return self;
}

-(id) initWithIDCarYearある時点で、メソッドを呼び出したとしましょう。

上記のコードが構造的に正しいことを知りたいのですが。

  • このコードでselfは、3回に設定されています。より良い解決策はありますか?
  • このコードでメモリリークが発生しますか?(ARCを使用)
  • 常にチェックする必要if(self = ...)がありますか、それとも冗長なコードですか?

ありがとうございました

@Edit 次のコードの方が良いですか?

-(id) initWithID:(NSInteger)id CarYear:(NSString *)year {
    if (self = [super init]) {
        [self setIsCurrentCar:NO];
        [self setID:id];
        [self setCarYear:year];
    }
    return self;
}
4

4 に答える 4

9

あなたのコードは大丈夫ですが、私はinit-callsを逆の順序で構造化します。最も詳細なものは指定された初期化子であり、より一般的なものはいくつかのデフォルト値をバブルアップします。

-(id) initWithID:(NSInteger)id 
         CarYear:(NSString *)year 
{
    if(self = [super init]) {
        _year = year;
        _id = id;
    }
    return self;
}

-(id)initWithID:(NSInteger)id 
{
    return [self initWithID:id CarYear:@"unset"];
}

-(id)init 
{
    return [self initWithID:0];
}

より一般的な初期化子の1つを呼び出すと不正な状態が生成される場合は、代わりにエラーをスローして使用を禁止できます。

車にはIDが必要ですが、1年は必要ないと仮定します。使用しても問題ありませんが、initWithID使用initすると一貫性のない状態になるため、使用しないように強制します。

-(id)init 
{
    [NSException raise:NSInternalInconsistencyException 
                format:@"You must use -initWithID: or -initWithID:CarYear:", NSStringFromSelector(_cmd)];
    return nil;
}

  • このコードでは、selfは3回設定されています。より良い解決策はありますか?

上記を参照

  • このコードでメモリリークが発生しますか?(ARCを使用)

いいえ、すべて問題ありません

  • if(self = ...)を常にチェックする必要がありますか、それとも冗長コードですか?

私があなたに示したように:あなたはチェーンで異なるinitメソッドを呼び出すことができます。そのチェーンの最後だけがそれを実行する必要があります。


-(id) initWithID:(NSInteger)id CarYear:(NSString *)year {
    if (self = [super init]) {
        [self setIsCurrentCar:NO];
        [self setID:id];
        [self setCarYear:year];
    }
    return self;
}

init-methodsで自分自身にセッターを使用しないでください。Appleのドキュメントを参照してください。

于 2012-12-21T19:39:46.073 に答える
3

上記のコードが構造的に正しいことを知りたいのですが。

はい。何の問題もありません。

このコードでは、selfは3回設定されています。より良い解決策はありますか?

それはかなり正常です。わざわざ変更するつもりはありません。

このコードでメモリリークが発生しますか?(ARCを使用)

いいえ。

(self = ...)が常にあるかどうか、または冗長コードであるかどうかを確認する必要がありますか?

する必要はありません、絶対に行う必要があります。詳細については、この質問を参照してください。

于 2012-12-21T19:06:19.783 に答える
2

1つの必須の初期化変数と2つの事実上オプションの変数があるようです。

initIDとcarYearにメソッドと2つの@property()を実装することをお勧めします。これにより、初期化子の数が減り、クラスの使用契約がより適切に反映されます。

于 2012-12-22T03:45:26.117 に答える
1

私の少しの知識から...tried to create overloads for Initializationこのステートメントはここでは使用されるべきではありません。

通常、overload同じ名前の複数の引数を意味しますが、obj-cではこれに従いません。obj-cでは、パラメータに名前を付けることでオーバーロードが偽造されます。

したがって、ここには3つの異なるコードのセットがあり、それぞれが他のメソッドと呼ばれています。また、同じオブジェクトに3回メモリを割り当てず、代わりに初期化するため、メモリリークは発生しません。

于 2012-12-21T19:53:43.770 に答える