Возврат nil в методе возвращаемого типа NSInteger - PullRequest
10 голосов
/ 07 января 2010

У меня есть следующий метод источника данных UITableView:

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

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

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

1 Ответ

22 голосов
/ 08 января 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...