Что на самом деле является @selector?

Есть некоторые функции, которые принимают в качестве аргумента @selector (methodName). Я использовал NSLog, чтобы узнать, что такое @selector, и возвращает целое число. Это похоже на PID, но когда я запускал ps ax, что PID не удалось найти. Что представляет это целое число и почему мы должны использовать @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, использует сначала арифметическую операцию на селекторе, чтобы узнать, является ли это сохранением, выпуском, сообщением об автоопределении и что-то делать в этих особых случаях. Например, просто вернитесь, если вы используете сборщик мусора.