2011-10-20 7 views
6

Estoy usando Xcode 4.2 para escribir y Clang 3.0 para crear un programa que demuestre un bloqueo en particular.Over-release que hace que la ventana se entumezca

El programa tiene una ventana que significa mantener alrededor que está configurada en el plumín para "Liberar cuando está cerrado", por lo que se libera en exceso en usos posteriores. Está destinado a ser una hoja, por lo que se muestra utilizando beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:. Intentar mostrar la ventana por segunda o tercera vez debería bloquear la aplicación.

Recuerdo que sucedió hace un año, con el programa recibiendo EXC_BAD_ACCESS y que desencadena el depurador para detenerse en ese punto. También recuerdo haber podido cazar el problema en Instruments usando la plantilla de Zombies.

Eso es lo que quiero (este programa es parte de una presentación para mostrar las técnicas de depuración), pero eso no es lo que está sucediendo ahora. Ahora, el programa no falla; Los instrumentos muestran que el conteo retenido en la ventana se reduce a 1 dos veces, pero no más bajo, por lo que no se desasigna.

Eso estaría bien si el problema se detuviera allí; Podría simplemente ocultar y mostrar la hoja otra vez o dos. El problema es que, la segunda vez que menciono la hoja (debería estar muerto pero aún tiene al menos uno para mantenerla viva), es insensible.

Con esto quiero decir que ni la hoja ni ningún control en ella (contiene un campo, una vista de texto y dos botones) responde a los eventos. El latido del corazón no hace nada en eso; la ventana tiene un botón OK, pero cuando la ventana está entumecida, el botón OK no pulsa. Nada funciona para descartar la hoja.

Pero el programa no se ha bloqueado. Todavía puedo interactuar con los menús y el Dock muestra que el programa está respondiendo. Si trato de dejarlo, emite un pitido, ya que tiene una hoja abierta.

¿Qué está causando que la ventana se entumezca y qué puedo hacer al respecto?

Aquí es una versión reducida del programa que también presenta el problema: https://github.com/boredzo/NumbWindow

+0

Adición: al jugar con la aplicación de prueba, parece que la hoja vuelve en cualquier estado que haya quedado. Si la cierro haciendo clic en el botón Cancelar, el botón Cancelar seguirá estando resaltado cuando regrese. –

+0

¿Está habilitado ARC? – NJones

+0

@NJones: No. Probablemente me apegue a MRC en este programa y presentación siempre que haya una buena posibilidad de que los nuevos programadores de Cocoa necesiten usar el código MRC, incluso si aún no lo escriben. –

Respuesta

4

no creo que usted debe utilizar -close para hacer la hoja desaparezca. Si cambia la línea [sheet close]; para que sea [sheet orderOut:self];, entonces funciona correctamente.

En cuanto a por qué son diferentes, no sé. Pero mi experiencia ha sido usar siempre -orderOut: para descartar hojas, y nunca -close. The documentation backs me up on this:

Listado 3 DID-final selector de

- (void)didEndSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo 
{ 
    [sheet orderOut:self]; 
} 

tl; dr:

Estás usando el método equivocado para que el panel desaparezca.

+0

Interesante. El inconveniente es que tendré que pensar en otra forma de implementar el error con RWC, pero ese es un problema para otro día. Gracias. –

+0

FTD: "Llamar al método' orderOut: 'hace que la ventana se elimine de la pantalla, pero no hace que se lance. Consulte el método' close' para obtener información sobre cuándo se lanza una ventana. " (Casi nunca uso '-close'); – Wevah

+1

La documentación recomienda 'orderOut:', pero no contraindica específicamente 'close' ni da ninguna razón por la que pueda ver por qué no. –

Cuestiones relacionadas