Was ist der Unterschied zwischen copy
und retain
für NSString
?Was ist der Unterschied zwischen "kopieren" und "behalten"?
- (void)setString:(NSString*)newString
{
string = [newString copy];
}
Was ist der Unterschied zwischen copy
und retain
für NSString
?Was ist der Unterschied zwischen "kopieren" und "behalten"?
- (void)setString:(NSString*)newString
{
string = [newString copy];
}
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.
Rückhalte- und Kopieren sind zwei verschiedene Dinge, die ersten ist konzeptionell Call-by-reference während der zweiten Call-by-Wert ist.
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.
Kopie: erstellt eine neue Instanz, die eine Kopie des Empfängers ist. Es bedeutet, dass Sie 2 verschiedene
habenbehalten: Erhöht die retainCount
des Empfängers. Ein Objekt wird aus dem Speicher entfernt - (mit dealloc), wenn retainCount 0 ist.
Ich denke, Sie meinen "dealloc'ed" (ein wenig peinlich, dieses Wort zu verbieten), nicht "festgefahren" – Brian
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.
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 ... :)
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.
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
Retain kopiert nicht die Referenz. –
Erstellt die 'Kopie' ein neues Objekt ?? , – Dhiru
Es sollte erwähnt werden, dass '' copy' zu retain' für die meisten der 'Foundation' Klassen entspricht, die nicht wandelbar sind. – rpetrich
Sehr informative .. – Krishnan
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) –