UIControl 如何管理它的目标?

How does UIControl manage its target?

苹果:

// the action cannot be NULL. Note that the target is not retained.
- (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;

请注意,目标未保留。

在 UIControl 中+BlocksKit.m

BKControlWrapper *target = [[BKControlWrapper alloc] initWithHandler:handler forControlEvents:controlEvents];
[handlers addObject:target];
[self addTarget:target action:@selector(invoke:) forControlEvents:controlEvents];

那么如何UIControl管理目标,为什么目标没有发布?

bk_addEventHandler:forControlEvents: 方法通过将 BKControlWrapper 个实例添加到 NSMutableSet 来保留它。该集合由 events 字典保留,该字典由控件本身保留,因为该字典使用 OBJC_ASSOCIATION_RETAIN_NONATOMIC.

与控件相关联

重要的是,您传递给 bk_addEventHandler:forControlEvents: 的块不会创建保留循环。您必须通过确保块在需要时使用弱引用来做到这一点(比如它需要引用视图控制器而不是引用控件)。