Вопрос Я хотел бы спросить, что происходит, когда непустой метод достигает конца без возврата?
Окружающая среда Этот вопрос относится к iOS
и Objective-C
. Я не уверен, как вещи, описанные в этом вопросе, ведут себя в другом месте.
Введение и история
Обычно, когда вы объявляете непустой метод в Objective-C и не указываете return
, Xcode показывает ошибку компиляции
Control reaches end of non-void function
и запрещает вам компилировать, пока вы не исправите эту проблему.
Система может быть очень умной, определяя, может ли ваш код достичь конца непустой функции, или не может, — распознавая, удовлетворяют ли ваши блоки if/else всем параметрам, проходя через переключатели и т. д.
Тем не менее, я нашел один (и на самом деле могут быть и другие) варианты, как заставить компилятор подумать: «Эй, приятель, да, этот код выглядит прекрасно, давайте скомпилируем его и повеселимся!». Это было случайно и вызвало некоторые головные боли. Вот код!
Кодекс
typedef enum eSections { eSectionRecent, eSectionAround, eSectionAll } eSections;
...
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSInteger localSection = section;
if (numberOfSections == 2) localSection++;
switch ((eSections)@(localSection))
{
case eSectionRecent:
return 1;
break;
case eSectionAround:
return 1;
break;
case eSectionAll:
return 3;
break;
}
}
Результат
С этим кодом компилятор думает, что можно позволить этому методу скомпилироваться, потому что эй, есть объект-переключатель, который является перечислением, и есть случай для каждого из возможных значений перечисления. , так что да, звучит правдоподобно...
Так что мне очень интересно, что происходит теперь, когда компилятор запутался и дал мне доработать этот ошибочный код до конца?
Ошибка
Для всех, кто интересуется, моя ошибка была в (eSections)@(localSection)
, где вместо ввода localSection
в eSections я набрал @(localSection)
, который компилируется в NSNumber
и вместо значения использует указатель на объект, таким образом, не совпадая ни с одним из case
, поскольку указатели могут быть довольно длинными (и, скорее всего, не 0, 1 или 2). Далее произошло то, что проект попытался выделить место для действительно огромного количества ячеек (я думаю, что не указывать возврат было чем-то вроде давайте просто добавим туда какое-то значение памяти) и в конечном итоге разбил приложение для давление памяти.
Спасибо за все ответы!