2011-10-20 8 views
6

Sto usando Xcode 4.2 per scrivere e Clang 3.0 per creare un programma che mostri un particolare crash.Over-release che rende la finestra intorpidita

Il programma ha una finestra che significa mantenere ciò che è impostato nel pennino su "Rilascio da Chiuso", quindi è sovrascritto negli usi successivi. È pensato per essere un foglio, quindi viene mostrato usando beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:. Cercando di mostrare la finestra una seconda o terza volta si dovrebbe bloccare l'applicazione.

Ricordo che è successo un anno fa, con il programma che riceveva EXC_BAD_ACCESS e che faceva scattare il debugger in quel punto. Ricordo anche di essere in grado di scovare il problema in Strumenti usando il modello di Zombi.

Questo è quello che voglio (questo programma fa parte di una presentazione per mostrare le tecniche di debug), ma non è quello che sta succedendo ora. Ora, il programma non si blocca; Gli strumenti mostrano che il numero di ritenzione sulla finestra scende a 1 due volte, ma non inferiore, quindi non viene deallocato.

Sarebbe bene se il problema si fermasse lì; Potrei semplicemente nascondere e mostrare il foglio un'altra volta o due. Il problema è, la seconda volta che faccio apparire il foglio (dovrebbe essere-morto-ma-ha-almeno-mantieni-ti-conservi-vivi), è insensibile.

Con ciò intendo che né il foglio né alcun controllo in esso contenuto (contiene un campo, una visualizzazione di testo e due pulsanti) risponde agli eventi. Il battito cardiaco non fa nulla in esso; la finestra ha un pulsante OK, ma quando la finestra è intorpidita, il pulsante OK non pulsa. Nulla funziona per respingere il foglio.

Ma il programma non si arresta. Posso ancora interagire con i menu e il Dock mostra che il programma sta rispondendo. Se provo a smettere, emette un segnale acustico, poiché ha un foglio.

Che cosa sta causando la finestra intorpidita e cosa posso fare al riguardo?

Ecco una versione ridotta del programma che presenta anche il problema: https://github.com/boredzo/NumbWindow

+0

Addendum: giocando ulteriormente con l'app di test, sembra che il foglio ritorni in qualsiasi stato lasciato. Se lo chiudo facendo clic sul pulsante Annulla, il pulsante Annulla è ancora evidenziato quando ritorna. –

+0

ARC è abilitato? – NJones

+0

@NJones: No. Probabilmente starò attaccato a MRC in questo programma e presentazione, a patto che ci siano buone possibilità che i nuovi programmatori Cocoa debbano usare il codice MRC, anche se non lo scrivono ancora. –

risposta

4

non credo che si dovrebbe utilizzare -close per rendere il foglio di andare via. Se si modifica la riga [sheet close]; in [sheet orderOut:self];, allora funziona correttamente.

Per quanto riguarda perché sono diversi, non lo so. Ma la mia esperienza è stata quella di utilizzare sempre -orderOut: per eliminare i fogli e mai -close. The documentation backs me up on this:

Listing 3 Forse-end selettore

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

tl; dr:

State usando il metodo sbagliato per rendere il pannello andare via.

+0

Interessante. Il rovescio della medaglia è che dovrò pensare ad un altro modo per implementare il bug con RWC, ma questo è un problema per un altro giorno. Grazie. –

+0

FTD: "Chiamare il metodo orderOut:' fa sì che la finestra venga rimossa dallo schermo, ma non causa la sua uscita.Vedi il metodo 'close' per informazioni su quando viene rilasciata una finestra." (Non uso quasi mai '-close'); – Wevah

+1

La documentazione raccomanda 'orderOut:', ma non contrasta in modo specifico 'close' o fornisce una ragione per cui io possa vedere perché no. –

Problemi correlati