"Сохраняет ли NSNotification объект? (Аналогично NSMutableDictionary или Array) ... то есть я могу освободить объект после отправки уведомления"
Яне уверен, что параметры object
и userInfo
сохраняются этим методом или нет, но на практике это не должно иметь большого значения.
Я думаю, вы, возможно, предполагаете, что NSNotificationCenter
создает этиуведомления и их трансляция в асинхронном режиме, но это не так.Как указано в документации для NSNotificationCenter
(см. Ссылка на класс NSNotificationCenter ), уведомления отправляются синхронно:
Центр уведомлений доставляет уведомления наблюдателям синхронно.Другими словами, методы postNotification:
не возвращаются, пока все наблюдатели не получили и не обработали уведомление.Для асинхронной отправки уведомлений используйте NSNotificationQueue
.В многопоточном приложении уведомления всегда доставляются в потоке, в котором было опубликовано уведомление, что может не совпадать с тем, в котором зарегистрирован сам наблюдатель.
Итак, в вашем коде уведомлениеЦентр создает уведомление, а затем передает его через центр по умолчанию.Любые объекты, которые зарегистрировались для этой комбинации имени уведомления и объекта, получат уведомление и затем выполнят селектор, который они указали, когда они зарегистрировались для этого уведомления.После этого элемент управления возвращается в класс, который разместил уведомление.
Другими словами, к тому времени, когда ваш код попадет в строку [teamDictCopy release]
, teamDictCopy
уже будет «использоваться» всемизаинтересованные стороны.Таким образом, не должно быть никакой опасности в его выпуске.
Просто примечание о соглашениях.Как правило, параметр object:
предназначен для объекта, отправляющего уведомление, а параметр userInfo:
предназначен для NSDictionary
дополнительной информации.Поэтому обычно вы обрабатываете уведомление следующим образом:
NSMutableDictionary *teamDictCopy = [self.teamDict mutableCopy];
[teamDictCopy setObject:
[NSNumber numberWithInt:self.scrollViewIndex] forKey:@"imageIndex"];
if([self.statusButton.title isEqualToString:@"Completed"]){
[[NSNotificationCenter defaultCenter] postNotificationName:@"UnComplete"
object:self userInfo:teamDictCopy];
}
[teamDictCopy release];