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:
的块不会创建保留循环。您必须通过确保块在需要时使用弱引用来做到这一点(比如它需要引用视图控制器而不是引用控件)。
苹果:
// 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:
的块不会创建保留循环。您必须通过确保块在需要时使用弱引用来做到这一点(比如它需要引用视图控制器而不是引用控件)。