2012-07-16 48 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