2012-07-16 50 views
1

我想攪拌canPerformAction:withSender:方法爲UIResponder及其所有的子類重寫此方法。Swizzling和超

我這樣做是通過將原始實現存儲在按類名稱鍵入的字典中;並在調用原始實現之前,在實現的調試版本中查找字典。

這似乎在某些情況下工作正常,但在原始實現調用super時失敗。然後我的調試方法不斷地被調用,程序進入無限遞歸。

這裏有什麼問題?

回答

2

的調酒後,-original-custom

-(void)custom { 
    [self custom]; // calls -original 
} 

-(void)original { 
    [self original]; // calls -custom 
} 

說,如果你在超絞合的方法,objc_msgSendSuper將這樣做:原來叫定製,反之爲您提供遞歸。


-(void)custom { 
    [self original]; // calls -custom, makes recursion 
} 

-(void)original { 
    [self custom]; // calls -original, makes recursion 
} 
+0

我的自定義是這樣的: - (無效){定製 //做些額外的事情 [自我原創] } 原始大概是這樣的: - (空)original { //做一些本地化邏輯 [super original] } 自定義和原創只爲專門覆蓋層次結構中這些方法的類調配。 我總是進入與同一類的自定義無限遞歸;永遠不要打電話給超級。 – Karthik 2012-07-16 12:35:46

+1

@Karthik但這是很自然的,再次看到答案,調用'-original'之後調用'-custom'並且它有'[self original]'在裏面再次調用'-custom'(因爲swizzle)製作inf循環。如果你想從'-custom'裏面調用'-original',調用'[self custom]',那就可以了。 – 2012-07-16 12:50:52

+1

不幸的是,自己仍然指向基類,而不是超級。我通過使用imp_implementationWithBlock解決了這個問題。謝謝。 – Karthik 2012-07-17 05:29:46