2011-11-24 57 views
1

如果我繼承CALayer並覆蓋drawInContext:方法,那麼一切都很好。如果我爲CALayer創建一個類別,並重寫相同的方法(作爲子類化的替代方法),它將被調用,但不會繪製任何內容。當然,在這兩種情況下都會調用[super drawInContext:ctx]。爲什麼?
我沒有問題的子類,我只是好奇爲什麼會發生這種情況。我的印象是,可以使用類別來添加或覆蓋任何類的方法,作爲創建整個子類的替代方法。
謝謝!CALayer的子類VS類別

+1

可能重複的[選擇器發送到方法在類別中重寫失敗](http://stackoverflow.com/questions/7891822/selector-sent-to-method -overridden-in-category-failed) – jrturton

+2

基本上,在一個類別中調用超級實現會調用它們對應的對象的超類,而不是原來的對象實現,而這正是您要做的。 – jrturton

+0

哦,我明白了,我以爲我讀過某個稱爲原始方法的類中調用超級方法的地方,這聽起來很奇怪,但我隨之而來。我錯了:) – juandemarco

回答

2

調用在一個類別super實現調用它們放在你對,不是原來的對象實現的類對象的超這正是你正在嘗試做的。

super當在實例方法中的方法調用的上下文中使用時,調用超類的該方法的實現。

在一個類別中,您還沒有創建子類 - 您編寫的代碼直接由您所屬類的類執行。因此調用super的實現將被髮送到CALayer的超類,它是NSObject

因此,當我在類別中嘗試此操作時沒有收到編譯器警告時,我感到有些驚訝。

這裏有此進一步討論優良:Is calling super in a category the same as calling it in a subclass?

+0

還應該注意的是,使用類別來覆蓋框架類的方法幾乎肯定是一個壞主意。 _類的每個實例都使用重寫的方法,無論是由您還是其他人創建。 –