Deallocation 中的线程安全


原文成于2017年11月


背景

最近在浏览 Swift Talk 的过程中, 思考了一个很有意思的问题.

如果一个对象通过NotificationCenter注册了一个通知, 然后在这个对象的deinit方法中执行了removeObserver. 假如在对象调用deinit的过程中对应的事件发生了, 并产生了一个通知, 此时会有什么现象? 当事件发生/投递的线程和对象deinit的线程不是一个线程时, 会导致崩溃吗? Swift Talk #28最后5分钟内容

这个问题我觉得很有意思, 之前都没有意识到过.

事实上虽然这个问题是在"Swift Talk"中抛出, 但是并不是Swift独有的, OC 下的dealloc方法同样有这个问题. 另外, 虽然问题是以 Notification 为例, 但显然问题并不限于通知, 任何别的含有通知/回调机制的场景都会面临同样的问题.

Read More

Swift Practices & Perls (1)


原文成于2018年


本文积累学习 Swift 过程中获取到的好技巧, 以及 Swift Standard Library 使用的优秀范式 (tricks).

普通 Practices

Availability checks

使用 availability checks 将超出指定的"Base SDK"版本的代码块隔离起来. 在运行时, 系统会根据运行环境动态 check 该代码是否执行.

  • @available(iOS 9.0, *), method, type 定义时.
  • if #available(iOS 9.0, *), 使用 method, type 时.
  • 支持 guard 作为 early exit.

可以替代相对应的早期的以下调用:
UIDevice.current.systemVersion.compare("9.0", options: .numeric) == .orderedAscending

活用 “String-backed” enum

背景知识

在众多基于 raw value 的 enum 中, raw value 是String的最为特殊, 因为这样的 enum 在定义各个 case 时, 可以省去显式写出用来初始化该 enum 的 raw value. 这种情况下, 编译器默认追加代码, 使用各个 case identifier 的同名字符串作为 raw value.

1
2
3
4
5
// 各行 case 可以省略 // 之后的部分
enum ImageIdentifier: String {
case centerButton // = "centerButton"
case myFavorites // = "myFavorites"
}

另一方面, 这样的 enum 默认遵循RawRepresentable, 且关联类型RawValue == String. 这方便我们对于一系列有相同特征的 enum 依靠 protocol 提供统一操作.

案例

下述技巧最早出现于WWDC 2015, session 403.
该 video 已经被 apple 从公开列表中移除, 此处提供的是 web.archive 上的缓存.
也可以尝试直接获取 videopdf.

Read More

Hello World

Hi, 很高兴认识你, 我是 Lincoln. 明面上是一名 iOS 开发者, Swifter. 私下喜欢算法, 图形渲染, 数学.
这是我的 Resume.

2020年全球的疫情改变了世界, 也改变了我. 我喜欢记录和分享技术, 但以前除了在公司内部分享或与人当面交流, 我从未尝试把文字放到互联网上. 我觉得现在的环境对做出这样的改变是一个非常好的时机.

这里的文字主要有两部分内容. 一部分是正儿八经的博客, 另一部分是十足随意的笔记. 前者适合拿出来跟大家探讨, 但后者只能当成自己学习时的一些总结或提纲. 有些文章都是过去很久之前写成的, 我也趁这个把它们搬进博客的机会, 重新梳理或归纳了一下. 我确保这里的每一篇都是我自己对某个技术点的感悟, 绝不会照搬 copy 网上现有的东西. 如果阅读某一篇文字的你能从里面的某个地方有所收获, 自然我的努力也没有白费. 当然我更愿意你给我的文章提一些建议, 独乐乐不如众乐乐 xD.

我对网页前端开发有兴趣, 但远远称不上合格. 因此这个站点选择了最为基础的设施. 我使用了 Hexo 作为网站框架, 并托管GitHub Pages 上. 我使用的主题是 Hexo 最为基础的 landscape 风格. 平时的文章都是以 markdown 写成, 为了超越默认的 hexo markdown renderer 支持的功能, 我使用了 hexo-renderer-markdown-it-plus 插件来支持数学公式、目录、脚注等功能; 使用了 hexo-asset-image 插件来支持插入 local image. 我选择了 Disqus 来托管每篇文章的评论, 使用 hexo-generator-feed 自动生成 feed 订阅. 最后, 我使用 hexo-generator-sitemap 插件来自动生成 sitemap 供搜索引擎索引页面.


期待 Swift 统治世界😂