Gpake's

  • About

  • Tags

  • Categories

  • Archives

  • Search

试着读一下 SIL

Posted on 2019-03-06

这是 Swift 摸鱼系列的第二篇

上篇讲的是 Swift 底层是怎么调度方法的

这篇我们说一下探究 Swift 运行过程中最常用的工具之一:Swift Intermediate Language (SIL)

Swift Intermediate Language (SIL)

平常我们写 Swift 不用关心编译器怎么工作,了解底层逻辑可以帮你更好的理解语言本身的思想。

SIL 是一个专门为 Swift 定制,为了进行后续优化的语言。

这里我们不过多的介绍文档上的内容,而是关注它在解析中反映出 Swift 的底层逻辑。

Read more »

Swift 底层是怎么调度方法的

Posted on 2019-02-11 | Edited on 2019-02-21

经过多年的发展和前辈们的科普,我们都对 Objective-C 的 Method Lookup 机制了然于胸。
但是 Swift 是怎么进行方法派发 ( dispatch ) 的,倒是一个不太被常问到的一个问题。
不妨一起来看一看。

TL;DR

怎么让你的代码在运行时更快?

全文针对 Swift 4.2

  • 尽量使用 值类型,final
  • 用 private 等缩小访问权限,开启 Whole Module Optimization
  • 给协议添加默认实现

下表为 Swift 对象的派发方式与关键字的关系。

对象\派发方式 Static VTable Witness Table Message
Value Type 默认行为 N/A : protocol N/A
Swift Class final
extension
默认行为 : protocol dynamic
NSObject final
extension
默认行为 : protocol dynamic
Protocol extension 默认行为 N/A : NSObjectProtocol
@objc

注意:Witness Table 仅在调用对象类型为 Protocol 类型时,才会被引用。

Read more »

Swift Currying

Posted on 2019-02-02 | Edited on 2019-02-18

TL;DR

Swift 中的实例方法是柯里化的。本质是把 self 当做隐式参数的类方法,它会返回一个给实例用的函数。

我们先定义一个简单的 struct,然后调用:

1
2
3
4
5
6
7
8
9
10
struct aCls { 
func aFunc() {}
func aPrint(str: String) {
print(str)
}
}

let ins = aCls()
ins.aFunc()
ins.aPrint(str: "Hello")

其实,系统是这么帮你处理的

1
2
aCls.aFunc(ins)() 
aCls.aPrint(ins)(str: "Hello")

Read more »

Swift 如何给回调添加 @escaping 和 optional

Posted on 2018-12-12 | Edited on 2019-02-18

TL;DR

Swift 中写

1
func aFunc(callback: @escaping (() -> Void)?) {}

这么声明函数你会得到一个错误:

1
2
3
@escaping attribute only applies to function types
// clang 会建议你
Replace '@escaping ' with ''

请接受他的建议,去掉 @escaping,留下参数的可选型 ?

因为从 Swift 4 之后只有闭包 (Closure) 才会被隐式的标记为 nonescaping ,其他参数默认依然是 escaping 的。

Read more »

博客系统换成 HEXO + Next 主题

Posted on 2018-10-31 | Edited on 2019-02-18

看看 GitHub.io 上的文章,已经是好三年前的了,人家写了三年文章,我摸了三年鱼。

唏嘘不已。

Read more »

如何使用苹果自带的UUID

Posted on 2015-08-03 | Edited on 2019-02-18 | In iOS

TL;DR

其实苹果以 C 函数的方式提供了 UUID 的方法

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
- (void)testUUID
{
uuid_t u;
uuid_t ur;
uuid_t ut;

uuid_generate(u);
uuid_generate_random(ur);
uuid_generate_time(ut);

char a[16];
uuid_unparse(u, a);
char b[16];
uuid_unparse(ur, b);
char c[16];
uuid_unparse(ut, c);

// printf("%s\n", a);
// printf("%s\n", b);
printf("%s\n", c);
}

- (NSString *)uuid{
// Create universally unique identifier (object)
CFUUIDRef uuidObject = CFUUIDCreate(kCFAllocatorDefault);

// Get the string representation of CFUUID object.
NSString *uuidStr = (NSString *)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, uuidObject));

// If needed, here is how to get a representation in bytes, returned as a structure
// typedef struct {
// UInt8 byte0;
// UInt8 byte1;
// ...
// UInt8 byte15;
// } CFUUIDBytes;
// CFUUIDBytes bytes = CFUUIDGetUUIDBytes(uuidObject);

CFRelease(uuidObject);

return uuidStr;
}
Read more »

用键盘掌握你的Xcode

Posted on 2015-07-31 | Edited on 2019-02-18 | In Xcode

要尽量少用鼠标!因为会变成鼠标手! = =’’’

哈哈,其实键盘也好不到那里去,但是把手从键盘上移开去找鼠标,然后再定位屏幕上的位置其实是个负担挺大的问题,如果你有不止一块屏幕的话那就更糟了。

好在Xcode为大多数操作都预留了快捷键。下面我会介绍一下我平常是怎么用键盘与Xcode快乐地玩耍的。

Read more »

Core Data的多线程

Posted on 2015-01-17 | Edited on 2019-02-18 | In iOS CoreData

自己写的程序一直都没什么技术含量,很长一段时间都一直在用NSUserDefaults来做数据持久化。一些小型商业项目也几乎不存什么数据,更多的是展示逻辑和一些简单的数据存储。

最近有机会去处理大量数据,就开开心心的带着bug上路了。

之前的经验一直是在主线程处理所有的逻辑,所以也一直没有遇到什么太复杂的问题,而且UI上都是直接使用NSManagedObject的子类,现在回头看看也是勇敢。

Read more »

微小的火光

Posted on 2015-01-11 | Edited on 2019-02-18 | In 随感

说起来,都已经些许年,写过各种各样的bug,

曾经喜欢上这件事是想要玩游戏,到头来却越来越没有时间玩了。

一直在投入时间,可是却愈发觉得瓶颈的阻力。

回过头来冷静看,发觉自己一直都在某个点,没有一点进步。

细来想想,连自己想要走什么样的路都不清楚了。可我还嘲笑别人不知道如何选择自己的专业和工作。真是五十步笑百步。

前辈在半年前就发现了我的问题,要求我写博客。一直拖到现在。

我还是有野心的,虽然我迷了路。

我会努力探索,继续寻找自己的路,护着微小的火光。

夜月明星稀,独挑孤灯。记。

Gpake

9 posts
4 categories
1 tags
© 2019 Gpake
Powered by Hexo
|
Theme – NexT.Mist