Domanda

Sto cercando di implementare la mia versione di NSViewController (per la compatibilità a ritroso), e ho colpito un problema con le associazioni:. Dal momento che i binding mantengono il loro obiettivo, ho un cerchio mantenere ogni volta che mi legano attraverso il proprietario del file

Così ho pensato che avevo appena rimuovere in modo esplicito la mia vista dalla sua superview e rilasciare gli oggetti di alto livello, e che sarebbe preso cura degli attacchi, perché il mio controller non è aggrappato alle vedute più, così mi rilasciano e posso andare via. Ma per qualche ragione, il mio controller della vista continua a non ottenere rilasciato. Ecco un'applicazione di esempio esibendo il problema:

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

costruirlo, lanciarlo, e ha colpito Cmd-K ( "Crea Pennino" nel menu "Modifica") per caricare un pennino nella finestra vuota. Hit nuovamente Cmd-K per rilasciare il primo controller della vista (TestNibOwner) e caricare una nuova. Il vecchio controller della vista non viene mai dealloced, però.

Rimuovi il "valore" vincolante sulla casella di controllo, e viene rilasciato bene.

Se si imposta i punti di interruzione in occasione dell'uscita / mantenere / override autorelease, si vede che _NSBindingInfo mantiene la TestNibOwner, ma mai lo rilascia in caso di perdite.

Qualcuno sa come risolvere questo problema?

È stato utile?

Soluzione

Una cosa che ho fatto per lo stesso problema è quello di creare un NSObjectController procura dentro la mia pennino. La mia classe NSViewController-come ha un puntatore a questo proxy e tutti gli attacchi sono legati attraverso di essa. Quando voglio sistemare il controller della vista, ho poi faccio [selfProxy setContent: nil] sul controller oggetto e rilasciare il controller della vista. In questo caso il proxy NSObjectController agisce come l'auto-unbinder in questo caso.

E 'più manuale e non si può semplicemente rilasciare la vista da sola, ma lo fa risolvere il problema trattenere.

Io suggerirei di fare questo:

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

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

Nel vostro pennino, attacchi sarebbe successo attraverso un percorso simile:

selfProxy.content.representedObject.fooValue

Altri suggerimenti

Facendo una piccola indagine con classe-dump e gli amici, sembra che Apple ha una classe privata denominata NSAutounbinder che si occupa di questo lavoro sporco per classi come NSViewController e NSWindowController. Non posso davvero dire come funziona o come replicare, però.

Quindi, non posso davvero rispondere alla tua domanda su come prevenire il ciclo conservano accada per attacchi arbitrari in un pennino in carica, ma forse è un po 'di consolazione di sapere che Apple è barare, e tu non ti manca nulla ovvio . : -)

Quando si toglie il vista dalla sua superview, stai anche inviando un altro messaggio -RELEASE? E 'stato creato dal unarchiving dal pennino, giusto?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top