"¿El NSNotification retener el objeto ? (De forma similar a NSMutableDictionary o Array) ... lo que significa que puede liberar el objeto después de la publicación de la notificación "
No estoy seguro de si los parámetros object
y userInfo
se conservan mediante ese método o no, pero en la práctica, realmente no debería importar.
Creo que puede estar imaginando que NSNotificationCenter
está creando estas notificaciones y emitiéndolas de manera asíncrona, pero ese no es el caso. Como se indica en la documentación de NSNotificationCenter
(ver NSNotificationCenter Class Reference), las notificaciones se publican de forma sincrónica:
Un centro de notificaciones entrega notificaciones a los observadores sincrónica. En otras palabras, los métodos postNotification:
no devuelven hasta que todos los observadores hayan recibido y hayan procesado la notificación . Para enviar notificaciones asincrónicamente use NSNotificationQueue
. En una aplicación multiproceso , notificaciones se entregan siempre en el hilo en el que se publicó la notificación , que puede no ser el mismo hilo en el que un observador registrado sí.
Por lo tanto, en su código, el centro de notificaciones crea la notificación y luego la transmite a través del centro predeterminado.Cualquier objeto que se haya registrado para esta combinación de nombre de notificación y objeto recibirá la notificación y luego realizará el selector que especificó cuando se registraron para esa notificación. Luego, el control vuelve a la clase que publicó la notificación.
En otras palabras, cuando su código llegue a la línea [teamDictCopy release]
, el teamDictCopy
ya habrá sido "utilizado" por todas las partes interesadas. Entonces, no debería haber ningún peligro en liberarlo.
Solo una nota sobre las convenciones. En general, el parámetro object:
está destinado a ser el objeto que está publicando la notificación, y el parámetro userInfo:
está destinado a un NSDictionary
de información adicional. Por lo tanto, normalmente manejaría la notificación de la siguiente manera:
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];
Gracias ... su respuesta se aclaró más que mi pregunta. _always learning_ – MDMonty
Esto sería así si las NSNotifications solo se usaran con NSNotificationCenters. ¿Qué hay de NSNotificationQueue? En ese caso, estamos publicando de forma asincrónica y no importa si el objeto se conserva o no. – DougW