本期概要
- 话题:In-App Events 数据分析上线了;线上沙龙:抖音 iOS 基础技术大揭秘。
- Tips:在 Objective-C 中标记构造器为指定构造器。
- 面试模块:如何检测内存泄露。
- 优秀博客:野指针的捕获与防护。
- 学习资料:一份可视化的 Web 技能列表。
- 开发工具:SwiftInfo 是一个 CLI 工具,用于提取、跟踪和分析对 Swift 应用程序有用的指标。
本期话题
In-App Events 数据分析功能上线了
In-App Events 的展示效果数据可以在 App Store Connect 中的 App 分析查看了。应用分析还包括事件的页面展示,提醒和通知数据,以及由你的 In-App Events 触发的下载和重新下载的数量。每个指标都可以根据区域、资源类型、设备等进行查看,这样你就可以了解 In-App Events 是如何影响应用的发展和成功的了。
Analytics now available for in-app events
线上直播沙龙 - 抖音 iOS 基础技术大揭秘
内容介绍:如何保证抖音 App 的稳定性?如何给用户带来如丝般柔滑的流畅体验?如何在用户弱感知甚至无感知的情况下,推进抖音 App 的架构演进?如何利用容器等技术推进自动化测试?字节自研的 iOS 构建系统 JOJO 又是如何实现超级 App 构建效能提升 40% 的?本期字节跳动技术沙龙将以《抖音 iOS 基础技术大揭秘》为主题,为你全面揭开抖音 iOS 基础技术背后的技术能力!
沙龙时间:2022 年 1 月 22 日 14:00-17:25
开发 Tips
整理编辑:师大小海腾
在 Objective-C 中标记构造器为指定构造器
这是一个开发 tip,一个编码规范,也是快手的一道面试题。
指定构造器模式有助于确保继承的构造器正确地初始化所有实例变量。指定构造器通常为类中接收全部初始化参数的全能构造器,是类中最重要的构造器;便利构造器通常为接收部分初始化参数的构造器,它们调用当前类的其它构造器,并为一些参数赋默认值。便利构造器是类中比较次要的、辅助型的构造器。
Objective-C 类的指定构造器模式和 Swift 的略有不同。在 Objective-C 中,为了明确区分指定构造器和便利构造器,可以使用宏 NS_DESIGNATED_INITIALIZER
标记构造器为指定构造器,其它未添加该宏的构造器都成为了便利构造器。
objectivec - (instancetype)init NS_DESIGNATED_INITIALIZER;
使用这个宏会引入一些规则:
- 指定构造器的实现只能且必须
向上代理
到父类的一个指定构造器(with[super init...]
); - 便利构造器的实现只能且必须
横向代理
到当前类的另一个构造器(with[self init...]
),最终需要在当前类的指定构造器处终止链; - 如果一个类提供了一个或多个指定构造器,它必须覆写其父类的所有指定构造器作为(退化为)该类的便利构造器,并让其满足条件 2。这样才能保证子类新增的实例变量得到正确的初始化。
如果违反了以上任何规则,将会得到编译器的警告。
示例代码:
```objectivec @interface MyClass : NSObject - (instancetype)initWithTitle:(nullable NSString *)title subtitle:(nullable NSString *)subtitle NSDESIGNATEDINITIALIZER; - (instancetype)initWithTitle:(nullable NSString *)title; - (instancetype)init; @end
@implementation MyClass
(instancetype)initWithTitle:(nullable NSString *)title subtitle:(nullable NSString *)subtitle { self = [super init]; // [规则1] 指定构造器只能向上代理到父类指定构造器,否则会得到编译器警告:Designated initializer should only invoke a designated initializer on 'super' if (self) { _title = [title copy]; _subtitle = [subtitle copy]; } return self; }
- <