在Objective-C中,如何重新调用类的实例方法来调用另一个类中的方法?在Objective-C中,我是否重定向了一个包含实例的方法而没有进行子类化?
说一个UIView类A包含另一个名为childA的UIView类。我希望它能够在调用childA的drawRect时调用A类中的方法,而不必子类化childA,并在其drawRect中执行所需的调用。这怎么能实现?
另外,我如何动态地提供一个方法给childA的绘图类?我知道这可能不是一个好的做法,但它对于测试目的会很有用。
在Objective-C中,如何重新调用类的实例方法来调用另一个类中的方法?在Objective-C中,我是否重定向了一个包含实例的方法而没有进行子类化?
说一个UIView类A包含另一个名为childA的UIView类。我希望它能够在调用childA的drawRect时调用A类中的方法,而不必子类化childA,并在其drawRect中执行所需的调用。这怎么能实现?
另外,我如何动态地提供一个方法给childA的绘图类?我知道这可能不是一个好的做法,但它对于测试目的会很有用。
要回答你的第一个问题,关于重新布线的方法:
你不想在总的原则是做这个,因为它有点违背了面向对象设计的全部目的,而是出于测试目的,它可以有用。只要你在Leopard上,这也不是特别困难。
看看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
对于你提出的第一个问题,好像你会设置将UIView A作为childA和其他UIViews的委托对象 - 然后他们可以使用委托方法调用A中想要的额外绘图功能。
要么这样做,要么让每个孩子都要求superview,如果它是键入“A”调用您感兴趣的方法。
谢谢。我试图做所有这些,而不必继承childA。看起来你的建议会要求我继承childA(UIView类型)并在那里做必要的工作。 – Boon 2009-06-01 01:36:48