OGeek|极客世界-中国程序员成长平台

标题: ios - Objective-C:将大多数消息转发到另一个对象(在运行时) [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 08:12
标题: ios - Objective-C:将大多数消息转发到另一个对象(在运行时)

UIView的子类

我有一个 UIView 的子类 MyView

这个子类有一个@property UIView * realView

我想做什么

每当有消息发送到 MyView 时,我都想将其“转发”到 self.realView,除了少数消息。

例如,在 MyView 的实现中,我会有这个覆盖:

- (void)setBackgroundColorUIColor *)color
{
     [self.realView setBackgroundColor:color] ;
}

我可以在运行时自动覆盖所有方法,而不是显式覆盖所有方法吗?

异常(exception)情况

对于某些方法,我希望有一个明确的控制。例如:

- (void)setFrameCGRect)frame
{
    /* do stuff */
    
    [super setFrame:frame] ;
}



Best Answer-推荐答案


Instead of overriding explicitly all the methods, can I do it automatically, at the runtime?

您实现 -forwardInvocation: 方法以将任何无法识别的消息发送到另一个对象。 -forwardInvocation每当一个对象没有实现作为处理消息的第二次机会传递给它的选择器时,就会调用它。您可以覆盖它以将消息发送到另一个对象(这几乎是 NSProxy 所做的)、记录消息等。

正如@cobbal 在下面指出的那样,-forwardInvocation 将帮助您处理未在您的 super View 中实现的方法,但它不会处理 在 super View 中实现的方法因为您的 MyView 继承了这些实现。例如,如果您想使用 UIView 作为 UIButton 的代理,则 UIButton 特有的所有方法都可以由 -forwardInvocation:,但是UIView定义的不能。为了获得继承方法以外的行为,您当然需要重写。在某些情况下,您可以通过从 NSObjectUIResponder 而不是从 UIView 派生 MyView 来解决这个问题,从而避免继承的 UIView 实现,但如果 MyView 需要是一个真实的 View ,你就不得不重写每个方法。

如果您仔细想想,很难想象如果不显式覆盖每个继承的方法,您的目标会如何实现。您说您只想转发大多数 消息,但是糟糕的运行时如何知道您想要转发哪些消息以及不想转发哪些消息?它所能做的就是为给定的选择器寻找一个方法,如果找到就调用它,或者如果没有就采取一些行动(比如调用-forwardInvocation:)。

更新: @robmayoff 指出 -forwardingTargetForSelector:,我没有想到,但在您的情况下可能是更好的解决方案。但是,它仍然无法处理需要重定向从父类(super class)继承的方法的情况。

关于ios - Objective-C:将大多数消息转发到另一个对象(在运行时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24314468/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4