UIControl如何管理其目标?

时间:2015-09-26 04:42:16

标签: ios target uicontrol

苹果:

// 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如何管理目标,为什么目标没有被释放?

1 个答案:

答案 0 :(得分:0)

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

传递给$ cd <path/to/folder> 的块不会创建保留周期。您必须通过确保块在需要的地方使用弱引用(例如,它需要引用视图控制器而不是引用控件)来执行此操作。