在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