#objective-c
#objective-c
Вопрос:
У меня есть это предупреждение от компилятора:
Implicit conversion changes signedness: 'NSInteger' (aka 'int') to 'NSUInteger' (aka 'unsigned int')
Который исходит из этого кода:
- (NSInteger) tableView:(__unused UITableView *)tableView numberOfRowsInSection:(__unused NSInteger)section {
return [_data count];
}
Я понимаю предупреждение (странно, что метод делегирования ожидает NSInteger , но так оно и есть). Если я приведу [_data count] к NSInteger, правильно ли это отключить предупреждение?
Это может (очень маловероятно, но поскольку я учусь) переполнение буфера. Поскольку приведение уменьшит количество возможных значений.
Ответ №1:
Это нормально, чтобы выполнить приведение; это указывает на то, что вы намеренно выполняете преобразование.
Это не приведет к переполнению буфера. В исключительных случаях это может привести к тому, что значение будет ниже, чем вы ожидаете (поскольку an NSUInteger
может содержать большее положительное значение, чем a NSInteger
).
Однако, учитывая фактическое использование этого делегата в a UITableView
, это настолько маловероятно, что, по сути, невозможно.
Комментарии:
1. Об этом есть сообщение на форумах разработчиков Apple. Even
NSUInteger
обычно не может содержать больше положительных значений, чемNSInteger
becauseNSNotFound
определяется какNSIntegerMax
(notNSUIntegerMax
), что эффективно ограничивает значения, возвращаемые большинством базовых методов. Переполнение буфера тогда очень маловероятно, особенно здесь…2. @Sulthan — это довольно интересное наблюдение. Я полагаю, что это определено таким образом именно по этой причине; было бы слишком легко столкнуться с ошибками приведения, если
NSNotFound
бы они исчезли при приведении к aNSUInteger
…