内存管理中的特殊情况及应对策略
1. 通知中心的内存管理
1.1 使用 addObserver(_:selector:name:object:) 注册通知
当使用 NotificationCenter 注册通知时,如果调用 addObserver(_:selector:name:object:) 方法,需要注意将对象(通常是 self )的引用传递给通知中心。通知中心对该对象的引用是非 ARC 安全的,若该对象销毁后,通知中心仍尝试向其发送通知,会导致问题。因此,在对象销毁前必须取消注册。
1.2 使用 addObserver(forName:object:queue:using:) 注册通知
这种方式的内存管理更为复杂,具体如下:
- 调用 addObserver(forName:object:queue:using:) 返回的观察者令牌对象会被通知中心持有,直到取消注册。
- 如果提供的闭包函数引用了 self ,观察者令牌可能会持有 self ,导致 self 泄漏。且由于 self 被持有, deinit 方法不会被调用,无法在 deinit 中取消注册。
- 若同时持有观察者令牌,且观察者令牌持有 self ,会形成循环引用。 <
超级会员免费看
订阅专栏 解锁全文
10万+

被折叠的 条评论
为什么被折叠?



