Несколько идей:
вы можете инкапсулировать представление листа предупреждения / действия и делегировать его в один класс. Затем, когда вам понадобится представление предупреждений, вместо этого создайте MyAlertView, который также будет собственным делегатом и выполнит [самоотключение] после того, как пользователь нажмет кнопку.
делает ваше приложение Delegate единственным делегатом для всех ваших просмотров предупреждений и листов действий. Делегат приложения всегда присутствует во время работы приложения, поэтому с освобожденным делегатом проблем не возникнет.
Проблема с обоими решениями заключается в том, что если вам нужно, чтобы ваше приложение знало, что произошло в окне просмотра / действия предупреждений, вам нужно как-то сообщить заинтересованному классу о выборе пользователя.
Вы можете сделать это либо с помощью своих собственных делегатов - что будет означать, что вы вернулись на круги своя, либо с помощью уведомлений: когда вызывается делегат вида оповещения / листа действий, он отправляет уведомление ([[NSNotificationCenter defaultCenter] postNotificationName:NotificationName object:self userInfo:userInfo];
), в то время как заинтересованный объект будет искать это уведомление ([[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onNotification:) name:NotificationName object:nil];
) и выполнять любые задачи, необходимые в методе onNotification:(NSNotification*)aNotification
.
Вы сможете сами договориться о том, какой тип информации передается в этих уведомлениях (я думаю, что номера кнопки в классе NSNumber будет достаточно, или, возможно, также пропустите текст кнопки). И вам не нужно будет отслеживать все оповещения о взглядах - просто не забудьте удалить наблюдателя ([[NSNotificationCenter defaultCenter] removeObserver:self name:postNotificationName object:nil];
) в dealloc представлений.
Редактировать:
«Для этого мне нужно вручную позаботиться о каждом контроллере представления при создании объекта, который использует себя в качестве делегата, поскольку я не могу придумать способ автоматического создания и обновления этого списка».
На самом деле вы, вероятно, можете сделать это полуавтоматическим способом: создать одноэлементный объект с помощью метода, подобного
-(id)delegate:(id)delegate for:(id)forWhom
А потом вместо
someThingy.delegate = self;
вы бы сделали
someThingy.delegate = [[DelegateLocker defaultLocker] delegate:self for:someThingy];
Внутри DelegateLocker у вас будет MutableDictionary с классом делегата в качестве ключа и MutableArray для someThingies в качестве значения. Тогда, по вашему мнению, триллоки контроллеров вы бы назвали
[[DelegateLocker defaultLocker] delegateIsDying:self];
, который прошел бы через штуковину и назначил делегат = ноль для каждого
Недостатком, конечно, является то, что вы будете хранить все вещи в течение неопределенного периода времени вместо того, чтобы немедленно их выпускать.