0%

Swift是OO(面向对象)的语言,所以少不了方法和属性的重载等特性,程序只能在运行时来确定具体的方法或属性来间接调用或间接访问,这就叫做动态派发。从性能上考虑,对于动态派发的方法,会有常量时间的运行时开销。接下来将介绍三种方法来移除这样的动态性,finalprivate,全模块优化(Whole Module Optimization),以此提升性能。

考虑下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class ParticleModel {
var point = ( 0.0, 0.0 )
var velocity = 100.0

func updatePoint(newPoint: (Double, Double), newVelocity: Double) {
point = newPoint
velocity = newVelocity
}

func update(newP: (Double, Double), newV: Double) {
updatePoint(newP, newVelocity: newV)
}
}

var p = ParticleModel()
for i in stride(from: 0.0, through: 360, by: 1.0) {
p.update((i * sin(i), i), newV:i*1000)
}

如上述代码所示,调用过程为:

  1. 调用变量pupdate方法。
  2. 调用pupdatePoint方法。
  3. 获取p的元组类型变量point
  4. 获取p的属性velocity。

由于ParticleModel可以被子类,所以其方法和属性就能被重载,这就不可避免的需要使用动态调用。

在Swift中,动态调用是通过在一个方法表中找到方法然后执行间接的调用(类似于C++的虚函数表),对于这种先查找再调用的过程,其效率是要低于方法的直接调用,而且间接调用会阻止许多编译器优化,这将加重间接调用的开销。接下来将列举一些技巧来禁用动态派发的行为,以达到提升性能的目的。

阅读全文 »

Swift调用Objective-C的Runtime


首先,我们来测试一下使用Swift代码来调用Objective-C Runtime的方法,首先创建两个类,用来做对比,一个是纯的Swift类,另一个继承自NSObject:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//纯Swift类
class SwiftClass {
var aBool = true
var aInt = 3
var aStrig = "sss"
var aObject :AnyObject?

func swiftTest() {

}
}

//继承自NSObject的类
class SwiftWithOCClass :NSObject{
var aBool = true
var aInt = 3
var aStrig = "sss"
var aObject :AnyObject?

func swiftTest(aCharacter:Character) {

}

func justTest() {

}
}
阅读全文 »

Hello World,以前在学习以及项目开发中学到的很多知识点,都会记录在我的印象笔记中,作为整理学习,但是现在,我要开始把我的一些积累放到我的这个小博客上,有问题欢迎大家指正,也附上我的Github地址。ps:近期我会整理一下我的印象笔记,将一些知识点放到博客上来。

前言

在Swift中,为了确保类的存储属性都能有一个初始值,提供了几种初始化的方法,接下来将讨论一下Desinated(指定)、Convenience(便捷)初始化器。

Designated(指定)初始化器

  • 之前使用过Objective-C的应该比较了解指定初始化器,很多类都提供了指定初始化器,如UIViewController的为:- (instancetype)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle,UIView的- (instancetype)initWithFrame:(CGRect)aRect,其作用是该类或者其子类在初始化的过程中都会调用指定初始化器。

  • 当在类中定义指定初始化器时,该初始化器会初始化该类的所有存储属性,且当该类是有父类时,必须调用父类的指定初始化器,注意顺序,先初始化该类自己定义的存储属性,再使用super来调用父类的指定初始化器,跌倒过来编译器会报错。

1
2
3
4
5
6
7
8
9
10
11
class RecipeIngredient: Food {
var quantity: Int
//指定初始化器
init(name: String, quantity: Int) {
self.quantity = quantity
super.init(name: name) //放在该类存储属性初始化之后
}
override convenience init(name: String) {
self.init(name: name, quantity: 1)
}
}
  • 每一个类都必须至少有一个指定初始化器。
阅读全文 »

Disclaimer - 声明
Zhihu is a trademark of Zhihu. Inc. This app is not created nor endorsed by Zhihu Inc. All the information and content accessible through Zhihu Daily Purify are subject to Zhihu’s copyright and terms of use. This is a free app and does not charge for anything. All content are available for free from Zhihu.

『知乎』是 知乎. Inc 的注册商标。本软件与其代码非由知乎创作或维护。软件中所包含的信息与内容皆违反版权与知乎用户协议。它是一个免费软件,使用它不收取您任何费用。其中的所有内容均可在知乎获取。

前言

最近工作工作不是很忙,所以准备开发项目练练手,之前发现了这个*知乎日报API,其提供了知乎日报的API地址,所以决定开发知乎日报。先上Github地址,欢迎Star、Issues、Pull Request*。

展示

1.应用主页部分:

阅读全文 »