Что происходит, когда событие запускает и пытается выполнить обработчик событий в объекте, который больше не существует?

Наиболее подходящим способом решения этой проблемы является использование следующего метода:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    if(![touch.view isMemberOfClass:[UITextField class]]) {
        [touch.view endEditing:YES];
    }
}

Примечание: это не работает на экземплярах UIScrollView.

5
задан Draco 29 May 2009 в 07:18
поделиться

4 ответа

AFAIK, ClassBInstance не собирается сборщиком мусора, пока есть зарегистрированные события, потому что событие содержит ссылку на него.

Вы должны убедиться, что вы отменили регистрацию всех событий экземпляров, которые больше не используются.

Важны случаи, когда зарегистрированным экземпляром является IDisposable, потому что событие может быть запущено при удалении экземпляра. В этом случае я обнаружил, что проще всего позволить экземпляру зарегистрироваться и отменить регистрацию в Dispose.

11
ответ дан 18 December 2019 в 09:10
поделиться

События реализованы так, что пока ваш издатель жив, все подписчики будут поддерживаться издателем, даже если у вас нет других ссылок на них.

Конечно, это также означает, что вы должны отсоединять подписчиков, если вы хотите, чтобы они очищались независимо от издателя.

4
ответ дан 18 December 2019 в 09:10
поделиться

Если предыдущий экземпляр все еще жив, и новый экземпляр также подключил обработчик событий, событие запускает оба обработчика (по одному). Важно отслеживать, когда вы присоединяете обработчики событий к событиям, чтобы вы также отключали их, когда они больше не нужны. В противном случае старые экземпляры будут продолжать жить в памяти, выполняя обработчики событий, что может привести к неожиданным результатам.

3
ответ дан 18 December 2019 в 09:10
поделиться

Вы можете использовать мой WeakEventHandler, основанный на WeakReference. Поскольку он сохраняет слабую ссылку на прослушиватель событий, он не заставляет его работать.

см. Этот ответ

0
ответ дан 18 December 2019 в 09:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: