iphone - notification - observer swift
¿La NSNotification retiene el objeto? (2)
"¿La NSNotificación retiene el objeto? (De manera similar a NSMutableDictionary o Array) ... lo que significa que puedo liberar el objeto después de publicar la notificación"
No estoy seguro de si los parámetros de object
y de información de userInfo
son retenidos por ese método o no, pero en la práctica, no debería importar.
Creo que puede estar imaginando que NSNotificationCenter
está creando estas notificaciones y transmitiéndolas de manera asíncrona, pero ese no es el caso. Como se indica en la documentación de NSNotificationCenter
(consulte la referencia de clase de NSNotificationCenter ), las notificaciones se publican de forma sincrónica:
Un centro de notificación entrega notificaciones a los observadores de forma sincrónica. En otras palabras, los métodos
postNotification:
no regresan hasta que todos los observadores hayan recibido y procesado la notificación. Para enviar notificaciones de forma asíncrona utiliceNSNotificationQueue
. En una aplicación multiproceso, las notificaciones siempre se entregan en el hilo en el que se publicó la notificación, que puede no ser el mismo hilo en el que se registró un observador.
Por lo tanto, en su código, el centro de notificaciones crea la notificación y luego la difunde a través del centro predeterminado. Todos los objetos que se hayan registrado para esta combinación de nombre de notificación y objeto recibirán la notificación y luego realizarán el selector que especificaron cuando se registraron para esa notificación. Posteriormente, el control regresa a la clase que publicó la notificación.
En otras palabras, para cuando su código llegue a la línea de [teamDictCopy release]
, teamDictCopy
ya habrá sido "utilizado" por todas las partes interesadas. Por lo tanto, no debería haber ningún peligro en liberarlo.
Solo una nota sobre las convenciones. En general, el object:
parámetro está destinado a ser el objeto que publica la notificación, y el parámetro userInfo:
está destinado a un NSDictionary
de información adicional. Entonces, normalmente, manejarías la siguiente notificación:
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];
Mi pregunta está relacionada con el objeto que se agrega a un -postNotificationName:object: userInfo:
¿La NSNotification retiene el objeto? (de manera similar a NSMutableDictionary o Array) ... lo que significa que puedo liberar el objeto después de publicar la notificación
A continuación hay un fragmento de código para ayudar a describir mi pregunta ... ¿es válido para liberar el objeto? Un enlace a la documentación de Apple podría ser realmente útil.
NSMutableDictionary *teamDictCopy = [self.teamDict mutableCopy];
[teamDictCopy setObject:[NSNumber numberWithInt:self.scrollViewIndex] forKey:@"imageIndex"];
if([self.statusButton.title isEqualToString:@"Completed"]){
[[NSNotificationCenter defaultCenter] postNotificationName:@"UnComplete" object:teamDictCopy userInfo:nil];
}
[teamDictCopy release];
sí, puede liberar el objeto una vez que se haya establecido como el objeto de la notificación.
También puedes subclase.
en cuanto a un documento / declaración específica: no recuerdo uno, específicamente.
Sin embargo, esta es la base de los objetos, sus variables de instancia y las comunicaciones y señales distribuidas cuando los tipos se identifican como un objeto.
He escrito una prueba para ti, así que puedes estar seguro de esto. los casos de uso de notificaciones serían pocos si el objeto no fuera retenido. simplemente agregue un punto de interrupción donde se le indique, luego ejecute con los puntos de interrupción habilitados. ¡disfrutar!
#import <Foundation/Foundation.h>
@interface MONObject : NSObject
@end
@implementation MONObject
- (id)retain {
return self; /* << add breakpoint here */
}
/* needed to counter retain override
(although all MONObjects will leak in this example)
*/
- (void)release {
}
@end
int main(int argc, const char* argv[]) {
NSAutoreleasePool * pool = [NSAutoreleasePool new];
NSString * name = @"UnComplete";
MONObject * obj = [MONObject new];
[[NSNotificationCenter defaultCenter] postNotificationName:name object:obj userInfo:nil];
[obj release], obj = 0;
[pool drain];
return 0;
}