Должен ли я проверить на ноль в copyWithZone:? - PullRequest
3 голосов
/ 15 июля 2011

В примере Sketch в -[<NSCopying> copyWithZone:] не проверяется, если -[<NSObject> init] возвращает nil:

- (id)copyWithZone:(NSZone *)zone {
    SKTGraphic *copy = [[[self class] alloc] init];
    copy->_bounds = _bounds;
    copy->_isDrawingFill = _isDrawingFill;
    copy->_fillColor = [_fillColor copy];
    copy->_isDrawingStroke = _isDrawingStroke;
    copy->_strokeColor = [_strokeColor copy];
    copy->_strokeWidth = _strokeWidth;
    return copy;
}

Это означает, что во время выполнения будет нулевое разыменование, если оно вернет nil (т.е. ошибка).

Обычно ли в -[<NSCopying> copyWithZone:] программа не проверяет, возвращает ли -[<NSObject> init] nil? Должен ли я также сделать это нет? Я думаю об этом:

- (id)copyWithZone:(NSZone *)zone {
    SKTGraphic *copy = [[[self class] alloc] init];
    if (copy) {
        copy->_bounds = _bounds;
        copy->_isDrawingFill = _isDrawingFill;
        copy->_fillColor = [_fillColor copy];
        copy->_isDrawingStroke = _isDrawingStroke;
        copy->_strokeColor = [_strokeColor copy];
        copy->_strokeWidth = _strokeWidth;
    }
    return copy;
}

1 Ответ

2 голосов
/ 15 июля 2011

Я должен был бы согласиться и сказать, что он должен проверять ноль, поскольку копия напрямую обращается к мгновенным переменным, что приведет к падению, если копия равна нулю. Если бы это был просто доступ к свойствам и методам, это не было бы проблемой.

...