Pregunta

Estoy tratando de poner en práctica mi propia versión de NSViewController (para la compatibilidad hacia atrás), y he golpeado un problema con los enlaces:. Desde fijaciones conservan su objetivo, tengo un círculo retener cada vez que ato a través del propietario del archivo

Así que pensé que acababa de quitar explícitamente mi punto de vista de su supervista y suelte los objetos de nivel superior, y que se haría cargo de las fijaciones, porque mi controlador no se está aferrando a las vistas más, así que me liberan y puedo ir lejos. Pero por alguna razón, mi controlador de vista sigue sin ser liberado. He aquí una aplicación de ejemplo que presenta el problema:

http://dl.dropbox.com/u/34351/BindingsLeak.zip

Construir, lanzarlo, y pulsa Comando-K ( "Crear plumilla" en el menú "Editar") para cargar una ONI en la ventana vacía. Hit Cmd-K de nuevo para liberar el primer controlador de vista (TestNibOwner) y cargar una nueva. El antiguo controlador de vista nunca se dealloced, sin embargo.

Eliminar el "valor" de unión en la casilla, y se libera muy bien.

Si establece puntos de interrupción en la liberación / mantener / anulaciones autorelease, se ve que _NSBindingInfo conserva el TestNibOwner, pero nunca la libera en el caso fugas.

Alguien sabe cómo solucionar este problema?

¿Fue útil?

Solución

Una cosa que he hecho por el mismo problema es crear un proxy de NSObjectController dentro de mi semilla. Mi clase NSViewController similar tiene un puntero a este proxy y todos los enlaces están unidos a través de él. Cuando quiero limpieza el controlador de vista, entonces me hago [selfProxy setContent: nil] en el controlador de objeto y suelte el controlador de vista. En este caso el proxy NSObjectController actúa como el auto-unbinder en este caso.

Es más manual y no se puede simplemente liberar la vista por sí misma, pero sí resolver el problema de retener.

Te sugiero que hagas esto:

-(void) releaseTopLevelObjects
{
    // Unbind the object controller's content by setting it to nil.
    [selfProxy setContent:nil];

    NSLog( @"topLevelObjects = %@", topLevelObjects );
    [topLevelObjects release];
    topLevelObjects = nil;
}

En su plumín, encuadernaciones pasarían a través de una ruta como:

selfProxy.content.representedObject.fooValue

Otros consejos

Haciendo un poco de investigación con la clase-dump y amigos, parece que Apple tiene una clase privada llamada NSAutounbinder que se encarga de este trabajo sucio para clases como NSViewController y NSWindowController. Realmente no se puede saber cómo funciona o cómo replicar que aunque.

Por lo tanto, en realidad no puedo responder a su pregunta sobre cómo prevenir el ciclo de retener suceda para los enlaces arbitrarios en una punta cargada, pero tal vez es un consuelo saber que Apple está haciendo trampas, y no se está perdiendo algo obvio . : -)

Al quitar la vista de su supervista, es que también están enviando otro mensaje -release? Fue creado por desarchivándolos de la punta, ¿verdad?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top