Чтобы ответить на ваш первый вопрос о методах подключения:
Вы не хотите делать это по общему принципу, так как это в некоторой степени противоречит цели объектно-ориентированного проектирования, но для целей тестирования это может быть полезно. Пока вы на Леопарде, это тоже не особенно сложно.
Взгляните на Objective-C 2.0 Runtime Reference , который содержит ключи от королевства как бы. Посмотрите на функции class_getInstanceMethod
, method_getImplementation
, method_getTypeEncoding
и class_addMethod
, которые в сочетании позволяют изменять методы класса во время выполнения.
Если вы просто переключаете один селектор на другой, method_exchangeImplementations
- это полезный ярлык.
Чтобы ответить на ваш второй вопрос о динамическом предоставлении метода, это так же просто, как передать SEL методу и затем вызвать -performSelector:withObject:
:
@interface MyView : NSView {
SEL drawingSelector;
id drawingDelegate;
}
@property SEL drawingSelector;
@property id drawingDelegate;
@end
@implementation MyView
- (void)drawRect:(NSRect)rect {
[self.drawingDelegate performSelector:drawingSelector withObject:[NSValue valueWithRect:rect]];
}
@end