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 方法中调用 self 中的 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:51:22.343 回答
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 回答