Frage

Ich fange an zu verstehen-Speicher-management besser in objective-c, aber es gibt etwas, das ich nicht verstehen.Dies ist eine Eigenschaft Erklärung:

@property (nonatomic, retain)UILabel *myLabel;

und das ist Ihre unsichtbare synthetisierte setter (glaube ich):

- (void)setMyLabel:(UILabel *)newValue {
    if(myLabel != newValue) {
        [myLabel release];
        myLabel = [newValue retain];
    }
}

Das spart Ihnen die Arbeit zu behalten, und die Sachen jedes mal, aber sagen, dass ich mein Eigentum für die erste Zeit, seine noch nicht zugeteilt worden, und doch so seine reference count 0 ist, richtig?Also ich mache

UILabel *tempLabel = [[UILabel alloc] init];
self.myLabel = tempLabel;
[tempLabel release];

Ich bin mir nicht wirklich sicher, was dort passiert ist, wenn es löst nichts , aber sagen, dass die Eigenschaft bereits einen Wert hat, und wir setzen es.In den setter, zuerst veröffentlicht wird.So machen nicht, dass es verschwinden?Wenn der Verweiszähler ist, und dann in der setter seine freigegeben, wie funktioniert es bleiben, um den neuen Wert beibehalten?

Danke!!

War es hilfreich?

Lösung

Ich denke, Sie sind verwirrend, Objekte und Referenzen.Eine Eigenschaft ist eine Referenz auf ein Objekt und nicht das Objekt selbst.Wenn Sie oder unset eine Eigenschaft, die es sendet behält und gibt die Objekte, die es Punkte, aber die Referenz selbst ist Teil des Objekts, das die Eigenschaft ist, die in (in diesem Fall sich selbst).

Es könnte nützlich sein, zu Lesen, auf Dinge wie Pointer und lvalues.

Andere Tipps

Der Anfangswert von myLabel ist gleich Null, so dass Ihre erste Aufgabe auf die Eigenschaft, dh

self.myLabel = tempLabel;

wird loslassen Null, dh [nil release]. In Objective-C, eine Nachricht an nil Senden ist eine no-op, so wird dies nichts tun.

Auch in Ihrer dealloc Methode, sollen Sie:

[myLabel release];

, die die myLabel freigeben wird, wenn die Eigenschaft jemals vergeben wurde, die [newValue behalten] Ausgleich in dem Setter. Wenn die Eigenschaft nie zugewiesen wurde, dann wird es noch gleich Null, und wieder der [nil Release] wird ein No-op.

Lesen Sie die Speicher-Management-Regeln für die genaue Regeln auf, wenn Sie benötigen behalten / Release-Objekte.

Das Objekt wird „verschwinden“ (dh werden ausgeplant), wenn alle Eigentumsrechte auf sie aufgegeben wurden. Das heißt, wenn (oder kurz nach) alle alloc / Kopie / neue Anrufe haben mit Release / Autorelease Anrufe ausgeglichen worden ist.

Ich bin relativ neu in Objective-C auch, möchte aber versuchen, dies zu beantworten, mein Verständnis zu bekräftigen.

  

sagen, dass ich mein Eigentum zum ersten Mal gesetzt, sein Inhalt wurde noch nicht zugeordnet, so der Referenzzähler 0 ist, nicht wahr?

Ja, der Beibehaltungszähler 0 ist.

  

In dem Setter, zuerst wird es freigegeben. Also nicht, dass machen sie verschwinden?

Es subtrahiert 1 von der Anzahl der myLabel behalten. Wenn die Beibehaltungszähler von myLabel 0 erreicht, Objekt der Daten oder dass der myLabel Variable zeigt vom Speicher freigegeben wird.

  

Wenn der Referenzzähler zählt, und dann in dem Setter seines freigegeben, wie es um nicht bleibt auf den beibehaltenen neuen Wert gesetzt werden?

In diesem Szenario werden die Daten myLabel zeigt auf (Beibehaltungszähler wird 0) befreit werden und myLabel wird zeigen Sie dann auf null (es ist leer). Die Variable wird in der Klasse gesetzt und wird immer verfügbar sein, um Nachrichten zu diesem Setter zu akzeptieren, so können die neuen Daten zugeordnet werden, um myLabel ob myLabel der Beibehaltungszähler 0 oder 100.

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