Если вы больше не хотите получать уведомления, выполните метод экземпляра removeObserver:, относящийся к классу NSNotificationCenter. Это должно делаться лишь при условии, что центр уведомлений удерживает экземпляры объектов-слушателей. Если центр уведомлений продолжает удерживать экземпляр вашего класса после того, как он был высвобожден, могут возникать утечки памяти и ошибки. Поэтому убедитесь в том, что своевременно удаляете объект из списка наблюдателей.
Вся эта теория станет значительно более понятной, если пояснить на примере. Мы собираемся создать класс Person и добавить к нему два свойства: имя и фамилию. Оба этих свойства будут относиться к типу NSString. Затем в делегате нашего приложения мы собираемся инстанцировать объект типа Person. Но не будем задавать имя и фамилию этой персоны, а отошлем в центр уведомлений само уведомление и его пользовательский словарь. В этом пользовательском словаре уведомления запишем имя и фамилию как элементы типа NSString. В методе инициализации класса Person мы собираемся слушать уведомление, которое приходит от делегата приложения. Затем извлечем имя и фамилию из пользовательского словаря и зададим эти значения для соответствующих свойств объекта-персоны.
Вот заголовочный файл делегата нашего приложения:
#import
/* Имя уведомления, которое мы собираемся послать */
extern NSString *const kSetPersonInfoNotification;
/* Ключ имени в словаре пользовательской информации уведомления */
extern NSString *const kSetPersonInfoKeyFirstName;
/* Ключ фамилии в словаре пользовательской информации уведомления */
extern NSString *const kSetPersonInfoKeyLastName;
@interface AppDelegate: UIResponder
@property (nonatomic, strong) UIWindow *window;
@end
А вот реализация делегата нашего приложения:
#import «AppDelegate.h»
#import «Person.h»
NSString *const kSetPersonInfoNotification = @"SetPersonInfoNotification";
NSString *const kSetPersonInfoKeyFirstName = @"firstName";
NSString *const kSetPersonInfoKeyLastName = @"lastName";
@implementation AppDelegate
— (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
Person *steveJobs = [[Person alloc] init];
NSNotification *notification =
[NSNotification
notificationWithName: kSetPersonInfoNotification
object: self
userInfo:@{kSetPersonInfoKeyFirstName: @"Steve",
kSetPersonInfoKeyLastName: @"Jobs"}];
/* В настоящее время класс person слушает это уведомление. Этот класс
извлечет из уведомления информацию об имени и фамилии и задаст
собственные имя и фамилию, основываясь на информации, полученной
из пользовательского словаря уведомления. */
[[NSNotificationCenter defaultCenter] postNotification: notification];
/* Вот доказательство */
NSLog(@"Person's first name = %@", steveJobs.firstName);
NSLog(@"Person's last name = %@", steveJobs.lastName);
self.window = [[UIWindow alloc]
initWithFrame: [[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
Важнее всего в данном случае будет реализация класса Person (Person.m):
#import «Person.h»
#import «AppDelegate.h»
@implementation Person