Есть некоторые функции, которые принимают в качестве аргумента @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, использует сначала арифметическую операцию на селекторе, чтобы узнать, является ли это сохранением, выпуском, сообщением об автоопределении и что-то делать в этих особых случаях. Например, просто вернитесь, если вы используете сборщик мусора.