Есть некоторые функции, которые принимают в качестве аргумента @selector (methodName). Я использовал NSLog, чтобы узнать, что такое @selector, и возвращает целое число. Это похоже на PID, но когда я запускал ps ax, что PID не удалось найти. Что представляет это целое число и почему мы должны использовать @selector все время, а не просто передавать имя метода?
Что на самом деле является @selector?
Ответ 1
@selector() - это директива компилятора, чтобы превратить любое из скобок в SEL. A SEL - это тип, указывающий имя метода, но не реализация метода. (Для этого вам нужен другой тип, возможно, IMP или Method). Под капотом, SEL реализуется как char*, хотя полагаться на это поведение не очень хорошо, Если вы хотите проверить, что у вас есть SEL, лучший способ сделать это - превратить его в NSString* следующим образом:
NSLog(@"the current method is: %@", NSStringFromSelector(_cmd));
(Предполагая, что вы знаете, что _cmd является одним из скрытых параметров каждого вызова метода и является SEL, который соответствует текущему методу)
Objective-C Руководство по языку программирования содержит гораздо больше информации по этому вопросу.
Ответ 2
Я думаю, что поиск реализации Objective-C может быть полезен для понимания:
Селектор представляет собой целочисленное значение. Но его тип отличается от обычных значений C, поэтому вы не можете их назначить.
Имя селектора типа "methodName" - это строка, которая уникально представляет имя для этого целого.
Другие языки и системы называют эту уникальную программу широкой строкой для целочисленного отображения атома (Windows) или кварка (GTK).
Objective-C хранит все функции для класса внутри хэш-таблицы. Хеш-ключ является целым числом. Библиотека времени Objective-C просматривает хэш-таблицу при каждом вызове метода. Без уникального целочисленного числа было бы гораздо медленнее выполнять этот критический поиск.
Селектор больше не является непрозрачным указателем на структуру. С помощью MacOSX 10.6 функция времени выполнения obj_send, которая реализует вызов метода Objective-C, использует сначала арифметическую операцию на селекторе, чтобы узнать, является ли это сохранением, выпуском, сообщением об автоопределении и что-то делать в этих особых случаях. Например, просто вернитесь, если вы используете сборщик мусора.