2010-03-08 4 views

Antwort

45

In einer allgemeinen Einstellung erhöht das Beibehalten eines Objekts die Anzahl seiner Retains um eins. Dies hilft, das Objekt im Speicher zu behalten und zu verhindern, dass es weggeblasen wird. Was das bedeutet ist, dass, wenn Sie nur eine beibehalten Version davon halten, teilen Sie diese Kopie mit wem auch immer es an Sie weitergegeben.

Kopieren eines Objekts, wie auch immer Sie es tun, sollte ein anderes Objekt mit doppelte Werte erstellen. Stellen Sie sich das als Klon vor. Sie teilen den Klon NICHT mit demjenigen, der sie an Sie weitergegeben hat.

Im Zusammenhang mit NSString s insbesondere, können Sie möglicherweise nicht davon ausgehen, dass wer Ihnen eine NSString gibt Ihnen wirklich eine NSString gibt. Jemand könnte Ihnen eine Unterklasse geben (NSMutableString, in diesem Fall), was bedeutet, dass sie möglicherweise die Werte unter den Abdeckungen ändern könnten. Wenn Ihre Anwendung von dem übergebenen Wert abhängt und jemand dies an Ihnen ändert, kann es zu Problemen kommen.

+15

Es sollte erwähnt werden, dass '' copy' zu retain' für die meisten der 'Foundation' Klassen entspricht, die nicht wandelbar sind. – rpetrich

+0

Sehr informative .. – Krishnan

+3

Könnte ich vorschlagen, dass "Sie ** teilen ** diese * Instanz * mit wem auch immer es an Sie weitergegeben" ist klarer als "Sie ** teilen ** das * kopieren * mit wem auch immer es an Sie weitergegeben" ? (Sehen, wie wir gerade über das Kopieren sprechen) –

23

Rückhalte- und Kopieren sind zwei verschiedene Dinge, die ersten ist konzeptionell Call-by-reference während der zweiten Call-by-Wert ist.

3

Der größte Unterschied ist, dass wenn Sie copy verwenden, das Objekt, das Sie kopieren, das NSCopying Protokoll implementieren muss (sehr einfach zu tun). Nicht jedes Objekt implementiert das, so dass Sie sorgfältig darauf achten müssen, mit welchem ​​Typ Sie arbeiten (oder nach der Unterstützung dieses Protokolls suchen), wenn Sie versuchen, copy anzurufen.

Die beste Faustregel zur Verwendung von copy Ich kann mir vorstellen, dass NSString-Eigenschaften immer auf "Kopieren" statt auf Beibehalten gesetzt werden. Auf diese Weise erhalten Sie genauere Messwerte vom Leaks-Instrument, wenn Sie versauen und vergessen, eine Saite loszulassen, an der sich ein Objekt festhält. Andere Verwendungen von Kopien müssen sorgfältiger durchdacht werden.

1

Kopie: erstellt eine neue Instanz, die eine Kopie des Empfängers ist. Es bedeutet, dass Sie 2 verschiedene

haben

behalten: Erhöht die retainCount des Empfängers. Ein Objekt wird aus dem Speicher entfernt - (mit dealloc), wenn retainCount 0 ist.

+1

Ich denke, Sie meinen "dealloc'ed" (ein wenig peinlich, dieses Wort zu verbieten), nicht "festgefahren" – Brian

5

Wenn Sie retain verwenden, kopieren Sie den Zeigerwert aus dem ursprünglichen. Erweitern Sie auch den Referenzzähler um eins. kopiert die Daten, auf die der Zeiger verweist, und teilt sie der Exemplarvariablen der Kopie zu.

7

behalten: Es ist auf das erstellte Objekt getan, und es nur die Anzahl der Verweis erhöhen.

Kopie - Es erstellt ein neues Objekt und wenn neues Objekt erstellt wird beibehalten wird Zählung 1.

Hoffnung Diese Hilfe für U ... :)

0

behalten Attribut sein wird so festgelegt, dass es kann die andere Erinnerung behalten i.e es kann gemacht werden, um auf eine andere Adresse auch zu zeigen Kopie Kopiert zuerst die Adresse und behält sie dann bei.

6

Sein eine alte Post, aber hier ist mein Blick auf die Frage

Bewahren Sie die Zählung eines Objekts um 1 erhöht behalten und übernimmt den Besitz eines Objekts.

Während copy die im Speicher vorhandenen Daten kopiert und der Variablen zuweist, kopieren Sie im Fall einer Kopie zuerst die Daten von einem Speicherort und weisen sie der Variablen zu, die den Retain-Zähler erhöht.

Denken Sie daran, dass die Arbeiten auf Referenz- und kopieren Arbeiten an Wert behalten

+0

Retain kopiert nicht die Referenz. –

+0

Erstellt die 'Kopie' ein neues Objekt ?? , – Dhiru