美文网首页
Swift - 函数的派发方式.

Swift - 函数的派发方式.

作者: Zafir_zzf | 来源:发表于2018-01-23 17:13 被阅读51次

编译型语言有三种基础的派发方式: 静态派发;函数表派发;消息机制派发(动态派发).
我们都知道Objective-C是使用的消息机制派发,任何的方法调用都会转为为Objc_msgSend... 这是调用函数最动态的方式..这方派发方式的特点是开发者可以在运行时改变函数的行为.不止可以通过Method_swizzing来改变,甚至可以用isa-swizzing修改对象的继承关系,可以实现自定义派发.
消息机制派发这种非常动态的特性也会造成一些问题和它本身难以避免的问题.(例如不易于维护,可读性和性能等问题)

Swift作为比较年轻的高级语言,它会根据许多因素,在不同的地方选择不同的派发方式.并且随着Swift的版本也在优化更新它的派发方式.

  • 声明的位置
  • 引用类型
  • 具体行为
  • 显示标识符

最显然的就是在Swift中创建NSObject类,使用Runtime的方法,那必然这些函数是动态派发的..还有一些标注了dynamic的函数或者属性,他们都会使用消息机制.
我们在开发中当然没有必要完全知道自己编写的每一个函数到底是什么样的方式派发.但我们需要留意因为派发方式的不同可能会造成的问题.比如下面这个例子:

class Dog: NSObject {
    var name = ""
     static func ==(lhs: Dog, rhs: Dog) -> Bool {
        return lhs.name == rhs.name
    }
}

声明一个 Dog的类,并实现它的 "=="运算符,用来比较两个Dog的name属性是否一致.

let dog1 = Dog()
let dog2 = Dog()
print(dog1 == dog2) // true

这两个dog 的name都为"" ,所以 == 运算符返回true.
但如果我们修改一下代码.

  let dog1: NSObject = Dog()
  let dog2 = Dog()
  print(dog1 == dog2) // false

将dog1声明为NSObject, 我们发现 dog1与dog2比较的时候并没有走在Dog中声明的== 方法, 它调用的是NSObject中的==方法,.如果你不留意Swift中静态派发的行为...这可能和你预想的大有不同..
Swift并没有在运行时检查dog1的具体类型调用它本身的 == 方法.而是在编译阶段就决定了要调用类型NSObject的 == 方法.
详细的关于函数派发的资料参考: 参考

相关文章

  • iOS知识复习笔记(16)---swift相关

    一、函数的派发方式 swift函数的派发机制有三类:static直接派发(静态)派发、table函数派发,mess...

  • Swift如何显示指定派发方式

    Swift如何显示指定派发方式: 1、添加final关键字的函数使用直接派发 2、添加static关键字函数使用直...

  • Swift - 函数的派发方式.

    编译型语言有三种基础的派发方式: 静态派发;函数表派发;消息机制派发(动态派发).我们都知道Objective-C...

  • 浅谈Swift派发机制

    函数的派发机制分为:静态派发(直接派发)、函数表派发、消息派发 1、Swift中所有ValueType(值类型:S...

  • 深入理解Swift 派发机制

    正文 一张表总结引用类型, 修饰符和它们对于 Swift 函数派发方式的影响. 函数派发就是程序判断使用哪种途径去...

  • Swift 和 Objective-C的区别

    swift是静态语言 oc是动态语言 swift是面向协议编程 oc是面向对象编程 纯swift的函数派发方式是直...

  • Swift - 三种函数派发

    Swift 的函数派发可以分为 静态 和 动态 两种机制,而动态派发又分为 函数表派发 和 消息派发 。 Swif...

  • 初探Swift函数的派发方式

    派发方式 (Types of Dispatch ) 函数派发就是程序判断使用哪种途径去调用一个函数的机制. 每次函...

  • Swift的函数派发

    前言 对于Swift的学者来说函数派发有很大的误区:就是认为Swift沿用Objective-C的消息派发机制,且...

  • 再探Swift函数的派发方式

    Swift 的函数是怎么派发的呢? 我没能找到一个很简明扼要的答案, 但这里有四个选择具体派发方式的因素存在: 声...

网友评论

      本文标题:Swift - 函数的派发方式.

      本文链接:https://www.haomeiwen.com/subject/ulusaxtx.html