Где и как зарегистрировать объект для получения Уведомления?

Например, когда памяти становится мало, Система отправляет уведомление UIApplicationDidReceiveMemoryWarningNotification. Это все, что Apple говорит в своих документах на тот момент. Но откуда приходит это уведомление и каким методом оно отправляется? Или где и как я могу зарегистрировать то, что я получаю уведомления?


person Thanks    schedule 11.04.2009    source источник


Ответы (4)


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

Для получения дополнительной информации см. темы по программированию уведомлений для Cocoa и справочник по классу NSNotification .

person mouviciel    schedule 11.04.2009

В коде инициализации класса, который вы хотите получить, выполните следующий вызов метода:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMemoryWarning:) name: UIApplicationDidReceiveMemoryWarningNotification object:nil];

Это предполагает, что ваш класс также реализует метод handleMemoryWarning следующим образом:

- (void) handleMemoryWarning:(NSNotification *)notification
{
}
person m4rkk    schedule 11.04.2009
comment
Не забудьте вызвать removeObserver в файле Dealloc этого класса. - person Abizern; 11.04.2009
comment
Не могу редактировать. Селектор должен быть @selector(handleMemoryWarning:) - person DougW; 15.05.2010

Гораздо проще использовать делегат приложения и реализовать необязательный метод

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application

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

person Jim    schedule 11.04.2009
comment
Обратите внимание, как вы получаете имя делегата, взяв имя уведомления и удалив UI в начале, Notification в конце и уменьшив первую букву. - person Abizern; 11.04.2009

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

Если вы используете что-то вроде @selector(handleMemoryWarning) и - (void) handleMemoryWarning { }, объект НЕ БУДЕТ отправлять уведомление, и вы по-прежнему будете удерживать всю свою память.

Я был просто укушен этим.

person Ben Jackson    schedule 22.10.2010
comment
Совершенно неправда (и я тоже только что попробовал). Вы можете использовать селектор без параметров или с параметрами. Также используйте аппаратное обеспечение -> имитировать предупреждение памяти в симуляторе iOS. - person Dan Rosenstark; 11.10.2011
comment
Действительно? Вы проверяли это на всех устройствах и версиях ОС? Я был свидетелем того, как это происходит воочию в моем коде при тестировании. - person Ben Jackson; 12.10.2011
comment
Привет, Бен, я не сомневаюсь, что ты видел это на каком-то устройстве и версии ОС. Тем не менее, я НИКОГДА не видел, чтобы performSelector заботился о параметре или нет. Есть идеи, что это за устройство и версия ОС? - person Dan Rosenstark; 12.10.2011
comment
Вы можете выбрать, хотите ли вы использовать метод с параметром или без него, используя @selector(foo) или @selector(foo:). Поэтому, если вы используете предыдущую форму, то, как предупреждает Бен, вам нужно будет передать параметр. - person m4rkk; 22.10.2011
comment
Яр: не помню конкретное устройство и версию ОС, а я был так же удивлен в то время, как вы это читаете. - person Ben Jackson; 23.10.2011