Для методов экземпляра, self
является ссылкой на текущий объект.
Для методов класса, self
является ссылкой на текущий класс.
Если вы объявляете метод Objective-Cвот так
- (void)doSomethingWithObject:(id)object { ... }
компилятор в основном просто превращает его в функцию C со следующей сигнатурой:
void _i_classname_doSomethingWithObject_(const id self, const SEL _cmd, id object) { ... }
(где classname - это имя класса, к которому относится метод.Методы класса i
становятся c
)
Когда вы вызываете метод [foo doSomethingWithObject:bar]
, компилятор превращает этот вызов метода в вызов objc_msgSend
, который «перенаправляет» вызов в правильную реализацию:
objc_msgSend(foo, @selector(doSomethingWithObject:), bar);
Как вы можете видеть, параметры, переданные в objc_megSend
, такие же ожидаемые функцией C, содержащей реализацию метода Objective-C.