Ответ 1
"Сохраняет ли NSNotification объект? (аналогично NSMutableDictionary или Array)... что я могу освободить объект после размещение уведомления"
Я не уверен, сохранены ли параметры object
и userInfo
этим методом или нет, но на практике это не имеет большого значения.
Я думаю, вы можете представить себе, что NSNotificationCenter
создает эти уведомления и транслирует их асинхронно, но это не так. Как указано в документации для NSNotificationCenter
(см. Ссылка на NSNotificationCenter Reference), уведомления отправляются синхронно:
Центр уведомлений уведомления наблюдателям синхронно. Другими словами,
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];