Как 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 ответ
Решение
bk_addEventHandler:forControlEvents:
метод сохраняет BKControlWrapper
экземпляры, добавив его в NSMutableSet
, Этот набор сохраняется events
словарь, который сохраняется самим элементом управления, потому что словарь связан с элементом управления с помощью OBJC_ASSOCIATION_RETAIN_NONATOMIC
,
Это импорт, который блок вы передаете bk_addEventHandler:forControlEvents:
не создавать цикл сохранения. Вы должны сделать это, убедившись, что блок использует слабые ссылки, где это необходимо (например, если ему нужно обратиться к контроллеру представления, а не к элементу управления).