Запретить ARC освобождать то, что в настоящее время не используется, но скоро будет?

Я сталкивался с этой проблемой пару раз и хочу знать правильный подход.

Например, предположим, что я пишу приложение для 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свойством класса, который его использует, но это как-то глупо (а что, если я хочу показывать два предупреждения одновременно? ).

5
задан Anshu Chimala 25 July 2012 в 02:59
поделиться