Существуют функции времени выполнения, описанные в Справочник времени выполнения , который позволяет не только запрашивать функции класса или экземпляра, но также добавлять метод или даже создавать новый класс во время выполнения.Я говорю, что это очень динамичный вид отражения, который обычно не был доступен для языков на Си. Обертки Майка Эша - это оболочка Objective-C.Опять же, это может даже добавить методы!Базовый класс Cocoa, NSObject
, также предоставляет оболочки для многих функций времени выполнения, см. NSObject
справочник по протоколу .Например,
[foo respondsToSelector:@selector(bar:)];
if([foo isKindOfClass:[NSString class]]){ ... }
делает то, что говорят имена методов.Вы даже можете добавить метод на лету.Например,
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface Foo:NSObject
{
}
@end
@implementation Foo
-(void)sayHi
{
NSLog(@"Hi! from %@",NSStringFromSelector(_cmd));
}
+(BOOL)resolveInstanceMethod:(SEL)sel
{
Method method=class_getInstanceMethod(self,@selector(sayHi));
class_addMethod(self,sel,method_getImplementation(method),method_getTypeEncoding(method));
return YES;
}
@end
int main(){
NSAutoreleasePool*pool=[[NSAutoreleasePool alloc] init];
Foo* foo=[[Foo alloc] init];
[foo aeiou];
[foo bark];
[foo mew];
[pool drain];
return 0;
}
Это приводит к выводу
Hi! from aeiou
Hi! from bark
Hi! from mew
. Это происходит следующим образом:
SEL
- это переменная, которая представляетотправленное сообщение (или вызов метода в другой терминологии.) - вызовы времени выполнения Objective C
resolveInstanceMethod:
класса, если сообщение, отправленное экземпляру, не реализовано в классе - Такв этом случае я просто копирую реализацию предопределенного метода с именем
sayHi
в реализацию этого метода. - Из метода вы можете использовать
_cmd
, чтобы увидеть, какой селектор использовался при вызове метода,Таким образом, даже из одной sayHi
реализации мы можем получить различный вывод.
Некоторые из стандартных реализаций Cocoa (в частности, Key-Value-Coding, Key-Value-Observing и Core Data)использует динамическую среду для динамического изменения класса.