Swift 调用私有方法
Aug 29, 2022
_UICreateScreenUIImage 是用于生成屏幕快照的一个私有方法,效果类似按下截屏组合键,不过这个函数调用不会触发截屏音效。 在 Objective-C 里,只需要声明一下方法的原型就可以使用了。 在 Swift 里可以使用 @_silgen_name 来达到同样的效果: …
Xcode 13 中优化 Swift 对象的生命周期
Aug 28, 2022
默认情况下,Swift 对象的生命周期如下: 在 WWDC 21 中 ARC in Swift: Basics and beyond,新发布的 Xcode 13 增加了一个选项,用来优化 Swift 对象的生命周期: 当这个选项开启后,对象原本要超出作用域才会析构,现在被优化为在作用域内不再被使用就会被析构。 这个特性是在编译期间进行的,由编译器在适当的地方插入 release 来提前结束对象的生命周期。 …
ARC 与 AutoreleasePool
Aug 27, 2022
Objective-C 中的 ARC 与 AutoreleasePool Objective-C 中的对象在引用计数为 0 的时候就会被释放,为了解决手动管理引用计数(MRC)容易发生内存泄漏或者过度释放的问题,引入了自动引用计数(ARC)。 …
使用 spctl 检查 App 的来源
Aug 22, 2022
spctl --assess --verbose XX.app 输出结果: 来自于 Apple 的软件: /Applications/Xcode.app: accepted source=Apple System 从 Mac App Store 下载的软件: /Applications/WeChat.app: accepted source=Mac App Store 开发者自己打包的软件: 没在在 Apple 进行公证: /Applications/Impactor.app: accepted source=Developer ID 进行了 Apple 公证: /Applications/Visual Studio Code.app: accepted source=Notarized Developer ID 公证机制是 macOS Catalina 中要求使用的: https://developer.apple.com/cn/news/?id=09032019a …
C++ 中使用 RAII 的注意事项
Aug 20, 2022
RAII (Resource Acquisition Is Initialization) 翻译为中文是「资源获取即初始化」。 通常用来做局部资源清理或者防止忘记解锁导致死锁: class LockGuard { public: LockGuard() { lock(); } ~LockGuard() { unlock(); } private: static pthread_mutex_t _fastmutex; void lock() { pthread_mutex_lock(&_fastmutex); } void unlock() { pthread_mutex_unlock(&_fastmutex); } }; pthread_mutex_t LockGuard::_fastmutex(PTHREAD_MUTEX_INITIALIZER); 以上代码定义了一个局部锁,锁生效的域和这个类的生命周期所在域一致。 …
Git 的稀疏检出(Sparse checkout)功能
Aug 19, 2022
Git clone 默认是完整检出整个仓库,如果只想检出某一部分文件或者目录,就需要用到稀疏检出功能(Sparse checkout)。 举个例子,我只对 Telegram iOS 源码中的 SSignal 子模块感兴趣,想单独对它检出(Checkout)。 …
Swift 中的闭包(Closure)
Aug 17, 2022
普通闭包写法: let closure = { (data, error) in if let data = data { // handle data } } 使用闭包延迟求值: lazy var titleLabel = { () -> UILabel in let lable = UILabel() lable.font = .systemFont(ofSize: 13) lable.textColor = .systemOrange lable.textAlignment = .justified return lable }() 自动闭包 @autoclosure 修饰符,用于函数参数类型修饰,表示接受的类型是一个闭包或者是与闭包的返回类型相同的值。 …
Swift 中的 Any 和 AnyObject
Aug 17, 2022
AnyObject :表示任意的 class 类型的实例,包括来自 ObjC 类和纯 Swift 的类,类似于 id 在 ObjC 里的概念。 Any :表示任意的类型实例,Swift 中的所有数据类型都可以用它表示。 如何选择 如果需要表示任意的引用类型的实例或者需要与 ObjC 接口交互,使用 AnyObject。 …
Objective-C 中的轻量泛型(Lightweight Generics)
Aug 14, 2022
轻量泛型(Lightweight Generics)是 Xocde 7 开始增加的特性。 同时增加的另外两个新特性:可空性(Nullability)和 __kindof。 可空性 可空性是声明传入或输出的类型是否可以是 nil 值:nullable 表示可以是 nil,nonnull 表示不会是 nil,对应 Swift 里的可选类型。 …
双队列(Two Queue)优化 LRU 缓存算法
Aug 14, 2022
LRU 是使用在图像加载库中常用的缓存算法。 简单的描述 LRU 算法: 新的资源放在队列头部 当资源被使用,就把资源移动到队列头部 当队列满的时候,首先从队列尾部淘汰 看起来没有什么问题,不常用的资源会被先淘汰。 …