recibir quiero notificaciones mas google desactivar correos correo computrabajo como chrome celular cocoa macos

quiero - En Cocoa, ¿necesito eliminar un objeto para que no reciba notificaciones KVO al desasignarlo?



notificaciones gmail (3)

Cuando he registrado un objeto foo para recibir notificaciones de KVO desde otra barra de objetos (usando addObserver: ...), si desasigno a foo, ¿debo enviar un removeObserver:forKeyPath: message to bar in -dealloc?


Definitivamente estoy de acuerdo con Chris en el comentario "Stick to memory (y otros recursos escasos) en -dealloc and -finalize ...". Muchas veces veré que las personas intentan invalidar los objetos NSTimer en sus funciones dealloc. El problema es que NSTimer retiene sus objetivos. Entonces, si el objetivo de ese NSTimer es uno mismo, dealloc nunca será llamado, lo que dará como resultado pérdidas de memoria potencialmente desagradables.

Invalida en -invalidate y realiza otra limpieza de memoria en tu dealloc y finalize.


Un poco de información extra que he obtenido por experiencia dolorosa: aunque NSNotificationCenter utiliza referencias débiles de puesta a cero cuando se ejecuta en la recolección de basura, KVO no lo hace. Por lo tanto, puede salirse con la suya si no utiliza un observador NSNotificationCenter cuando usa GC (cuando usa retener / liberar, aún necesita quitar su observador), pero igual debe eliminar sus observadores de KVO, como describe Chris.


-removeObserver:forKeyPath: usar -removeObserver:forKeyPath: para eliminar el observador antes de que se -[NSObject dealloc] , así que sí, hacerlo en el método -dealloc de su clase funcionaría.

Sin embargo, sería mejor tener un punto determinista donde cualquier cosa que posea el objeto que está haciendo la observación podría decir que está hecho y (eventualmente) será desasignado. De esta forma, puede dejar de observar inmediatamente cuando ya no se necesita lo que está haciendo la observación, independientemente de cuándo se desasigna.

Es importante tener esto en cuenta porque la vida útil de los objetos en Cocoa no es tan determinista como algunas personas parecen pensar que es. Los diversos frameworks de Mac OS X enviarán sus objetos -retain and -autorelease , extendiendo su vida útil más allá de lo que de otra manera -autorelease que sería.

Además, cuando realiza la transición a la recolección de elementos no utilizados de Objective-C, encontrará que -finalize se ejecutará en momentos muy diferentes, y en contextos muy distintos, que -dealloc . Por un lado, la finalización tiene lugar en un hilo diferente, por lo que realmente no puede enviar de forma segura -removeObserver:forKeyPath: a otro objeto en un método -finalize .

Se adhieren a la gestión de memoria (y otros recursos escasos) en -dealloc y -finalize , y utilizan un método de -invalidate separado para que un propietario le diga a un objeto que ha terminado con él en un punto determinista; hacer cosas como eliminar las observaciones de KVO allí. La intención de su código será más clara y tendrá menos errores sutiles de los que ocuparse.