Frage

Ich versuche, meine eigene Version von NSViewController zu implementieren (für die Rückwärtskompatibilität), und ich habe ein Problem mit Bindungen angeschlagen: Da Bindungen ihr Ziel behalten, habe ich einen Kreis, wenn ich über den Eigentümer von Datei bin.

Also dachte ich, ich würde meine Ansicht aus seiner Übersicht explizit entfernen und die Objekte der obersten Ebene freigeben, und das würde sich um die Bindungen kümmern, da mein Controller nicht mehr an den Ansichten festhält, also lösen sie mich und ich können es können Geh weg. Aber aus irgendeinem Grund wird mein View Controller immer noch nicht veröffentlicht. Hier ist eine Beispiel -App, die das Problem ausstellt:

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

Erstellen Sie es, starten Sie es und klicken Sie auf CMD-K ("Create NIB" im Menü "Bearbeiten"), um eine NIB in das leere Fenster zu laden. Drücken Sie CMD-K erneut, um den ersten Ansichts-Controller (TestNiboreer) zu veröffentlichen und eine neue zu laden. Der alte Ansichtscontroller wird jedoch nie umgegangen.

Entfernen Sie die "Value" -Bindung im Kontrollkästchen und es wird gut freigegeben.

Wenn Sie Breakpoints bei der Veröffentlichung/Retain/Autorelease -Überschreibung festlegen, sehen Sie, dass _nsbindingInfo den TestNiberner beibehält, ihn jedoch nie im undichten.

Weiß jemand, wie ich das beheben kann?

War es hilfreich?

Lösung

Eine Sache, die ich für dasselbe Problem getan habe, ist, einen Proxy NSObjectController in meiner NIB zu erstellen. Meine NSViewController-ähnliche Klasse hat einen Zeiger auf diesen Proxy und alle Bindungen werden durch sie gebunden. Wenn ich den View -Controller aufräumen möchte, dann mache ich [selfroxy setContent: nil] auf dem Objektcontroller und lasse den Ansichtscontroller frei. In diesem Fall fungiert der NSObjectController-Proxy in diesem Fall als Auto-Unbinder.

Es ist mehr manuell und Sie können die Ansicht nicht einfach von selbst veröffentlichen, sondern das Problem beheben.

Ich würde vorschlagen, dass Sie dies tun:

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

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

In Ihrer NIB würden Bindungen auf einem Weg wie folgt passieren:

selfProxy.content.representedObject.fooValue

Andere Tipps

Es sieht so aus, als hätte Apple eine private Klasse namens nsautounbinder, die sich um diese schmutzige Arbeit für Klassen wie NSViewController und NswindowController kümmert. Ich kann nicht wirklich sagen, wie es funktioniert oder wie man es repliziert.

Ich kann also nicht wirklich Ihre Frage beantworten, wie Sie verhindern können, dass der Haltungszyklus für willkürliche Bindungen in einer geladenen NIB stattfindet, aber vielleicht ist es ein Trost zu wissen, dass Apple betrügt und Ihnen nichts Offensichtliches fehlt. :-)

Wenn Sie Ihre Ansicht aus der Übersicht entfernen, senden Sie sie auch eine weitere Release -Nachricht? Es wurde geschaffen, indem es von der NIB entfaltet wird, oder?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top