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

时间:2015-06-07 16:32:27

标签: ios objective-c swizzling

我只是理解在obj c Method Swizzlingdangers of using method swizzling中完成的方法调整并且无法帮助,但是在使用类别进行方法调配和覆盖方法实现之间进行比较。 它们都有助于覆盖预定义框架方法的功能。 那么这两者之间是否存在差异,或者它们可以互换使用?

2 个答案:

答案 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/