0

私はこのコードを継承しました:

- (id)initWithLocation:(CLLocation *)inLocation {
    if (self = [super init])
    {
        _location = [inLocation copy];
    }
    return self;
}

- (id)initWithLocation:(CLLocation *)inLocation offsetValue:(NSNumber *)offset {
    if (self = [super init])
    {
        _location = [inLocation copy];
        _offset = [offset copy];
    }
    return self;
}

そして、最初のメソッドが指定されたイニシャライザを呼び出さない正当な理由があるかどうか疑問に思っています (たとえば、このように、 init メソッドで init メソッドを自分で呼び出しても問題ありませんか? )?

つまり、なぜこれをしないのですか:

- (id)initWithLocation:(CLLocation *)inLocation {
    if (self = [super init])
    {
        [self initWithLocation:inLocation offsetValue:nil];
    }
    return self;
}

- (id)initWithLocation:(CLLocation *)inLocation offsetValue:(NSNumber *)offset {
    if (self = [super init])
    {
        _location = [inLocation copy];
        _offset = [offset copy];
    }
    return self;
}
4

3 に答える 3

2

- (id)initWithLocation:(CLLocation *)inLocation offsetValue:(NSNumber *)offsetメソッドは指定された初期化子である必要があり、次の- (id)initWithLocation:(CLLocation *)inLocationように呼び出す必要があります。

- (id)initWithLocation:(CLLocation *)inLocation {
    return [self initWithLocation:inLocation offsetValue:nil];
}

NS_DESIGNATED_INITIALIZER を使用して、クラス インターフェイスで指定されたイニシャライザをマークすることもお勧めです。

- (id)initWithLocation:(CLLocation *)inLocation offsetValue:(NSNumber *)offset NS_DESIGNATED_INITIALIZER;
于 2015-02-26T10:53:43.623 に答える
0

あなたが実際に行う必要があるのは...

- (id)initWithLocation:(CLLocation *)inLocation {
    return [self initWithLocation:inLocation offsetValue:nil];
}

- (id)initWithLocation:(CLLocation *)inLocation offsetValue:(NSNumber *)offset {
    if (self = [super init])
    {
        _location = [inLocation copy];
        _offset = [offset copy];
    }
    return self;
}

そして、あなたは正しいです。この場合、そうしない理由はありません。

于 2015-02-26T10:52:27.707 に答える