TL; DR , если ни один из случаев не совпадает, функция возвращает управление вызывающей стороне, но возвращается значение undefined .
Заявление C / ObjC return
принципиально делает две вещи.Это приводит к тому, что его значение помещается в определенное место, так что вызывающий объект знает, где его искать.(Место, определяемое платформой / языком ABI.) Затем он перемещает элемент управления обратно к вызывающей функции (путем извлечения адреса из стека и перехода к нему).
В этом случае элемент управления собираетсяпроходите мимо конца switch
, и никакой return
устав не будет выполнен.Компилятор делает , однако выдает переход к концу метода.
(На самом деле - я не очень хорош в чтении ассемблера, но - аннотированный ассемблер с отладочной информациейя вижу, что Xcode 10.1 создает для вашего кода все последовательности переключений в одну точку выхода для метода. И эта точка выхода также достигнута, если ни одно из сравнений не выполнено успешно.)
Но мы перейдем к этому переходу, не поместив никакого значения в регистр возврата, что означает, что оно такое же, как и любое другое неинициализированное значение - мусор.Тот факт, что вы надежно получаете nil
, вероятно, объясняется простотой вашей тестовой программы или созданием конфигурации отладки.