Warum kann MonoTouch GC verwaltete Objekte nicht mit Refcount 1 beenden?

8

Ich glaube, ich verstehe, wie Mono GC und ObjC ref counting zusammen leben .

  

Wenn ein natives Objekt einen Verweiszählerstand von 1 hat, verhindern wir nicht, dass die verwaltete Instanz Datenmüll sammelt. Sobald die Anzahl der Referenzen über 1 steigt, verhindern wir, dass die verwaltete Instanz den Müll sammelt.

     

Dies liegt daran, dass ein verwaltetes Objekt den Benutzerstatus enthalten kann. Für verwaltete Objekte, die ein entsprechendes natives Objekt (z. B. die verwaltete UIView-Instanz) spiegeln, weiß MonoTouch, dass die Instanz keinen Status enthalten darf. Sobald kein verwalteter Code einen Verweis auf die verwaltete Instanz hat, kann der GC sie erfassen. Wenn zu einem späteren Zeitpunkt eine verwaltete Instanz benötigt wird, erstellen wir einfach eine neue Instanz.

Wenn ich also eine CustomButton erstelle, die UIButton erbt, füge sie als Unteransicht zu meiner View hinzu, lasse die verwaltete Referenz aus dem Bereich gleiten und führe dann GC aus, diese verwaltet CustomButton kann immer noch nicht abgeholt werden.

Warum kann es nicht gesammelt werden? Natürlich kann es zustandsähnliche Eigenschaften verwaltet haben, aber wenn es keine Verbindung zu verwalteten Objekten gibt, wen interessiert dieser Status ? Es kann auch einfach verschwinden, warum nicht?

Ich denke über einen möglichen Grund nach: Das Abonnieren von CustomButton -Ereignissen wird es nicht für den GC am Leben erhalten. Wenn das Objekt gesammelt wird, hören die Ereignisse auf zu feuern. Dies würde möglicherweise zu unerwartetem Verhalten führen.

Stimmt das? Gibt es andere Gründe dafür, das verwaltete Objekt am Leben zu erhalten, selbst wenn niemand es verbindet?

    
Dan Abramov 25.10.2012, 08:35
quelle

1 Antwort

6
  

Warum kann es nicht gesammelt werden? Natürlich kann es zustandsähnliche Eigenschaften verwaltet haben, aber wenn es keine Verbindung zu verwalteten Objekten gibt, wen interessiert dieser Zustand? Es kann auch einfach verschwinden, warum nicht?

Nativer Code kann Referenzen auf das Objekt haben, was dazu führen kann, dass das Objekt später wieder in den verwalteten Code übergeht.

Ich glaube, ein Codebeispiel würde veranschaulichen, was passieren würde:

%Vor%

Wichtig: Dieser Code dient nur dazu, den Grund zu verdeutlichen, warum der GC keine verwalteten Objekte sammeln kann, die einen Status haben könnten. Dieses spezielle Beispiel würde das wichtige Geheimnis nicht vergessen, da das Subviews-Array automatisch im verwalteten Code zwischengespeichert wird - dies ist jedoch im Allgemeinen nicht richtig.

    
Rolf Bjarne Kvinge 25.10.2012, 09:02
quelle