我只是了解了在 obj c Method Swizzling中进行的方法调配以及使用方法调配的危险,忍不住在进行方法调配和使用类别覆盖方法实现之间进行了比较。它们都有助于覆盖预定义框架方法的功能。那么两者之间有什么区别还是可以互换使用?
2 回答
主要区别在于,Objective C 阻止您从类别覆盖调用原始实现。这是因为 Objective-C 的super
调用是从超类开始的,而类别会覆盖同一类级别的方法。
另一方面,方法调配允许您保留对原始实现的引用,以便您可以从实现内部调用它。例如,在您第一个链接的文章中,作者写道:
- (void) logged_viewDidAppear:(BOOL)animated {
[self logged_viewDidAppear:animated];
NSLog(@"logged view did appear for %@", [self class]);
}
第二行调用logged_viewDidAppear:
方法,这看起来像是对自身的无条件调用,应该会导致无限递归。然而,这不是发生的事情:在 swizzling 之后,viewDidAppear:
由于方法 swizzling 的工作方式,这个调用被转换为对原始的调用。
相反,从类别中覆盖方法不会让您访问要覆盖的方法的逻辑。它允许您替换逻辑,但不允许您扩展它。
extension UIViewController{
public func myViewDidLoad(){
self.viewDidLoad()
//but you need to call this method everywhere replacing
}
//you cant do this
public func viewDidLoad(){
self.viewDidLoad()
//my code
}
}
类别或扩展允许您执行以下操作:添加计算属性和计算类型属性
定义实例方法和类型方法
提供新的初始化器
定义下标
定义和使用新的嵌套类型
使现有类型符合协议
(来自苹果)
他们不允许你扩展你正在扩展的同一个类的原始方法,如果你尝试像上面的代码方法签名冲突那样弹出。
您可能想查看此网站以图解方式了解该概念。我真的很喜欢它。
http://matteogobbi.github.io/blog/2014/12/15/extending-methods-in-a-category-by-method-swizzling/
确保查看这篇很棒的文章以获得良好的实现细节: http: //nshipster.com/method-swizzling/