Возвратите ноль на методе типа возврата NSInteger

У меня есть следующий метод UITableView DataSource:

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index 

На некоторых объектах (т.е. раздел индексируют заголовки) я просто хочу "ничего" не возвратить, так, чтобы табличное представление не переходило ни к какому разделу. Я пытался возвратить ноль, но я добираюсь, "Возврат делает целое число из указателя без броска" - предупреждение, так как NSInteger является, очевидно, не объектом, просто определение типа для целых чисел на 32/64 бита.

Как я не могу достигнуть никакого возврата / реакция на определенных индексных заголовках раздела?

10
задан ff10 7 January 2010 в 20:49
поделиться

1 ответ

Возвращение nil здесь является ошибкой, так как вы возвращаете целочисленный примитив, а не объект. (Вы получаете предупреждение, так как nil на самом деле является #define, который вычисляет в ((void *)0), что является нулевым указателем, а не целым нулем). Лучшим вариантом для кода Objective-C, который взаимодействует с Cocoa, вероятно, является использование NSNotFound, #define для NSIntegerMax, который используется во всем коде Cocoa для обозначения того, что заданное значение не существует в приемнике и т.д. (Другой вариант - использовать -1, что более распространено в коде C). То, что работает лучше всего, зависит от того, что ожидает код вызова и что он может обрабатывать.)

Хотя NSNotFound является знаковым значением, оно достаточно большое, чтобы вряд ли вы столкнулись с проблемой диапазона. (NSIntegerMax составляет примерно половину NSUIntegerMax, и очень немногие люди удаленно приближаются к 2 147 483 647 объектам - не говоря уже о вдвое большем количестве - на 32-битной земле. В 64-битном случае забудьте об этом, у вас на машине закончится физическая оперативная память задолго до того, как закончатся целые числа для индексов)

Кстати говоря, конвенция Cocoa должна использовать NSUInteger (а не NSInteger) для индексов. Беззнаковое целое число не может быть отрицательным, что обеспечивает некоторую защиту от вменяемости значений индексов; кроме всего прочего, становится проще отсеивать случайное целочисленное переполнение/переполнение. Если это пользовательский метод источника данных (как кажется), то я настоятельно рекомендую перейти на использование беззнаковых целых чисел. (Может помочь вспомнить/реализовать, что NSInteger и NSUInteger занимают одно и то же количество байт, они просто по-разному интерпретируют биты, так что "тратить" место при переключении типов не будет)

.
22
ответ дан 3 December 2019 в 17:59
поделиться