Я сталкивался с этой проблемой пару раз и хочу знать правильный подход.
Например, предположим, что я пишу приложение для iPhone и мне нужен собственный класс представления предупреждений, который использует блоки.
Итак, я пишу класс, а затем в своем коде иду:
MyAlertView *alert = [MyAlertView alertWithBlahBlahBlah...];
[alert addButton:@"button" withBlock:^{... }];
[alert show];
Где-то в классе представления предупреждений у нас есть
- (void)addButton:(NSString *)button withBlock:(void (^))block {
[_blocks setObject:[block copy] forKey:button];
}
- (void)show {
... drawing stuff...
UIButton *button =...
[button addTarget:self selector:@selector(buttonPressed:)...];
...
}
- (void)buttonPressed:(id)sender {
((void (^)())[_blocks objectForKey:[sender title]])();
}
Итак, представление предупреждений теперь отображается просто отлично. Проблема в том, что если я нажму кнопку, она попытается отправить селектор buttonPressed:
на отображаемый объект MyAlertView
. Однако MyAlertView
в настоящее время удален из супервизора. ARC решает, что, поскольку представление предупреждений больше никому не принадлежит, оно должно быть освобождено, не зная, что кнопка должна будет сообщать об этом в будущем. Это вызывает сбой при нажатии кнопки.
Как правильно сохранить вид предупреждения в памяти? Я мог бы сделать объект MyAlertView
свойством класса, который его использует, но это как-то глупо (а что, если я хочу показывать два предупреждения одновременно? ).