Что на самом деле @selector? - PullRequest
       13

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

11 голосов
/ 14 августа 2010

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

Ответы [ 2 ]

35 голосов
/ 14 августа 2010

@selector() - это директива компилятора, которая превращает все, что находится внутри скобки, в SEL.SEL - это тип для обозначения имени метода, но не реализации метода.(Для этого вам понадобится другой тип, вероятно, IMP или Method). Под капотом SEL реализован как char*, хотя полагаться на это поведение не очень хорошая идея.,Если вы хотите проверить, что у вас есть SEL, лучший способ сделать это - превратить его в NSString* следующим образом:

NSLog(@"the current method is: %@", NSStringFromSelector(_cmd));

(Предполагая, что вы знаете, что _cmd является одним изскрытые параметры каждого вызова метода, и это SEL, который соответствует текущему методу)

Руководство по языку программирования Objective-C содержит гораздо больше информации по этому вопросу.

0 голосов
/ 14 августа 2010

Я думаю, что понимание реализации Objective C может быть полезно для понимания:

Селектор - это целочисленное значение.Но его тип отличается от обычных целочисленных значений C, поэтому вы не можете их назначать.

Имя селектора, например, «methodName», - это строка, которая уникально представляет имя для этого целого числа.

В других языках и системах эта уникальная широкая строка программы называется целочисленным отображением атома (Windows) или кварка (GTK).

Objective-C хранит все функции для класса внутри хеш-таблицы.Ключ хеш-таблицы является целым числом.Библиотека времени выполнения Objective C ищет хеш-таблицу при каждом вызове метода.Без уникального целого числа этот критический поиск был бы намного медленнее.

Селектор больше не является непрозрачным указателем на структуру.В MacOSX 10.6 функция времени выполнения obj_send, которая реализует вызов метода Objective-C, использует арифметическую операцию с селектором в начале, чтобы выяснить, является ли это сообщение сохранения, освобождения, автоматического выпуска и что-то сделать в этих особых случаях.Например, просто вернитесь, если вы используете сборщик мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...