上一篇介绍了 Objective-C Messaging。利用 Objective-C 的 Runtime 特性,我们可以给语言做扩展,帮助解决项目开发中的一些设计和技术问题。这一篇,我们来探索一些利用 Objective-C Runtime 的黑色技巧。这些技巧中最具争议的或许就是 Method Swizzling 。
介绍一个技巧,最好的方式就是提出具体的需求,然后用它跟其他的解决方法做比较。
所以,先来看看我们的需求:对 App 的用户行为进行追踪和分析。简单说,就是当用户看到某个 View
或者点击某个 Button
的时候,就把这个事件记下来。
手动添加
最直接粗暴的方式就是在每个 viewDidAppear
里添加记录事件的代码。
@implementation MyViewController ()
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[Logging logWithEventName:@“my view did appear”];
}
- (void)myButted:(id)sender
{
[Logging logWithEventName:@“my button clicked”];
}
这种方式的缺点也很明显:它破坏了代码的干净整洁。因为 Logging
的代码本身并不属于 ViewController
里的主要逻辑。随着项目扩大、代码量增加,你的 ViewController
里会到处散布着 Logging
的代码。这时,要找到一段事件记录的代码会变得困难,也很容易忘记添加事件记录的代码。