3

我只是了解了在 obj c Method Swizzling中进行的方法调配以及使用方法调配的危险,忍不住在进行方法调配和使用类别覆盖方法实现之间进行了比较。它们都有助于覆盖预定义框架方法的功能。那么两者之间有什么区别还是可以互换使用?

4

2 回答 2

9

主要区别在于,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 的工作方式,这个调用被转换为对原始的调用。

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

于 2015-06-07T16:41:12.860 回答
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
}
}

类别或扩展允许您执行以下操作:添加计算属性和计算类型属性

定义实例方法和类型方法

提供新的初始化器

定义下标

定义和使用新的嵌套类型

使现有类型符合协议

(来自苹果)

他们不允许你扩展你正在扩展的同一个类的原始方法,如果你尝试像上面的代码方法签名冲突那样弹出。

您可能想查看此网站以图解方式了解该概念。我真的很喜欢它。

http://matteogobbi.github.io/blog/2014/12/15/extending-methods-in-a-category-by-method-swizzling/

确保查看这篇很棒的文章以获得良好的实现细节: http: //nshipster.com/method-swizzling/

于 2015-09-09T08:46:15.633 回答