我只是理解在obj c Method Swizzling和dangers of using method swizzling中完成的方法调整并且无法帮助,但是在使用类别进行方法调配和覆盖方法实现之间进行比较。 它们都有助于覆盖预定义框架方法的功能。 那么这两者之间是否存在差异,或者它们可以互换使用?
答案 0 :(得分:8)
主要区别在于Objective C阻止您从类别覆盖中调用原始实现。这是因为Objective-C的super
调用从超类开始,而类重写了同一类级别的方法。
- (void) logged_viewDidAppear:(BOOL)animated {
[self logged_viewDidAppear:animated];
NSLog(@"logged view did appear for %@", [self class]);
}
第二行调用logged_viewDidAppear:
方法,该方法看起来像是对其自身的无条件调用,应该导致无限递归。但是,这不是发生的事情:在调整之后,由于方法调配的方式,此调用会转换为对原始viewDidAppear:
的调用。
相反,从类别覆盖方法不会让您访问要覆盖的方法的逻辑。它允许您替换逻辑,但它不允许您扩展它。
答案 1 :(得分:1)
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
}
}
分类或扩展程序允许您执行以下操作: 添加计算属性和计算类型属性
定义实例方法和类型方法
提供新的初始化程序
定义下标
定义并使用新的嵌套类型
使现有类型符合协议
(来自Apple)
他们不允许您扩展您正在扩展的同一类的原始方法,如果您尝试上述代码方法,则会弹出签名冲突。
您可能需要查看此网站以获取概念图。我真的很喜欢它。
http://matteogobbi.github.io/blog/2014/12/15/extending-methods-in-a-category-by-method-swizzling/
请务必查看这篇精彩的文章,以获得良好的实施细节: http://nshipster.com/method-swizzling/