Наиболее подходящим способом решения этой проблемы является использование следующего метода:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
if(![touch.view isMemberOfClass:[UITextField class]]) {
[touch.view endEditing:YES];
}
}
Примечание: это не работает на экземплярах UIScrollView.
AFAIK, ClassBInstance не собирается сборщиком мусора, пока есть зарегистрированные события, потому что событие содержит ссылку на него.
Вы должны убедиться, что вы отменили регистрацию всех событий экземпляров, которые больше не используются.
Важны случаи, когда зарегистрированным экземпляром является IDisposable, потому что событие может быть запущено при удалении экземпляра. В этом случае я обнаружил, что проще всего позволить экземпляру зарегистрироваться и отменить регистрацию в Dispose.
События реализованы так, что пока ваш издатель жив, все подписчики будут поддерживаться издателем, даже если у вас нет других ссылок на них.
Конечно, это также означает, что вы должны отсоединять подписчиков, если вы хотите, чтобы они очищались независимо от издателя.
Если предыдущий экземпляр все еще жив, и новый экземпляр также подключил обработчик событий, событие запускает оба обработчика (по одному). Важно отслеживать, когда вы присоединяете обработчики событий к событиям, чтобы вы также отключали их, когда они больше не нужны. В противном случае старые экземпляры будут продолжать жить в памяти, выполняя обработчики событий, что может привести к неожиданным результатам.
Вы можете использовать мой WeakEventHandler, основанный на WeakReference. Поскольку он сохраняет слабую ссылку на прослушиватель событий, он не заставляет его работать.