目标c中方法调配与类别之间的差异

dea*_*ier 3 objective-c swizzling ios

我只是在理解方法调配中的方法调整使用方法调配的危险,并且无法在绘制方法调配和使用类别覆盖方法实现之间进行比较.它们都有助于覆盖预定义框架方法的功能.那么两者之间有什么区别,或者它们可以互换使用?

das*_*ght 9

主要区别在于Objective C阻止您从类别覆盖中调用原始实现.这是因为Objective-C的super调用从超类开始,而类重写了同一类级别的方法.

另一方面,方法调配允许您保留对原始实现的引用,以便您可以从实现中调用它.例如,在第一个链接的文章中,作者写道:

- (void) logged_viewDidAppear:(BOOL)animated {
    [self logged_viewDidAppear:animated];
    NSLog(@"logged view did appear for %@", [self class]);
}
Run Code Online (Sandbox Code Playgroud)

第二行调用logged_viewDidAppear:方法,该方法看起来像是对其自身的无条件调用,应该导致无限递归.然而,这不是发生的事情:在调整之后,viewDidAppear:由于方法调配的方式,此调用会转换为对原始调用的调用.

相反,从类别覆盖方法不会使您访问要覆盖的方法的逻辑.它允许您替换逻辑,但它不允许您扩展它.