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 算法: 新的资源放在队列头部 当资源被使用,就把资源移动到队列头部 当队列满的时候,首先从队列尾部淘汰 看起来没有什么问题,不常用的资源会被先淘汰。 …
weak-strong dance 的注意事项
Aug 13, 2022
在使用逃逸 Block 的时候,为了防止 self 被循环引用,一般使用以下方式: - (void)foo { __weak typeof(self) wself = self; [self auth:^(NSString *token) { typeof(self) self = wself; if (!self) { return; } }]; } 在 Block 外部定义一个 __weak 类型的 self 引用,在 Block 内部使用同名的局部 self 变量,以上的技巧就叫做 weak-strong dance 。 …
ObjC 中的黑魔法 Swizzling
Aug 07, 2022
ObjC 是动态语言,方法调用都是在运行期间通过 objc_msgSend 向对象发送消息来实现。 而且 ObjC 支持动态增加/交互方法的实现,这个技术称之为 Swizzle。 Swizzle 本质上是改变了方法映射表中的 SEL 与 Method 的对应关系。 …
C/C++ 中的 static 和 inline 的作用
Aug 03, 2022
static 把符号限制为 LOCAL,避免链接时同名造成冲突。 inline 把符号标识为 WEAK,如果出现多个同名则只有一个拷贝。 static inline 组合,作用和 static 一样,区别在于编译器视情况决定是否开启内联。 …
如何使用代码结束 iOS 应用
Jul 26, 2022
在 iOS 中,强制退出 App 有以下几种方法: exit(0); 退出整个 App [NSThread exit]; 退出当前线程,在主线程执行可以退出 App abort() 异常中止 App,可以通过捕捉信号 SIGABRT 来进行异常处理 assert() 断言也会让 App 异常中止 因为不管使用何种方式杀掉 App,都会产生正在使用中的资源不能正常释放的问题,比如数据库写入一半 App 中止了。 …
Combine 与响应式编程
Jul 16, 2022
什么是响应式编程? 简单的理解就是:仅当事件发生以后才响应处理。 c <= a + b + c... 以上表达式中,c 是响应处理的逻辑,a, b, c 这些都是事件,当它们发生以后就会触发执行 c。 …