Antwort

20

Die Zuordnung ist genau das. Der Zeiger string ist im Grunde eine Bezeichnung, die auf bestimmte Adressen im Speicher zeigt. Eine Neuzuweisungsanweisung würde dieses Label auf eine andere Adresse im Speicher verweisen!

Es ändert nicht die Referenzzählung oder macht irgendetwas anderes in Objective-C. Sie müssen die Referenzzähler selbst zu halten, wenn Sie in einer nicht-Garbage-Collection-Umgebung ausgeführt werden:

[string release]; 
string = [@"Some text" retain]; 

jedoch Stringliterale müssen nicht verwaltet werden, da sie statisch zugewiesen bekommen und nie bekommen deallokierten ! So sind die release und retain Methoden nur NOOPs (d. H. Keine Operationen). Sie können sie sicher weglassen.

+0

Danke! Das ist, was ich in Bezug auf die Zeigerzuweisung erwartete ... ... Aah, so die "-1" behalten Zählung nach der Zuweisung (dh [String RetainCount]) ist ein Flag, das angibt, dass "String" auf ein String-Literal zeigt muss also nicht verwaltet werden, kann aber sicher freigegeben werden? – notMyScreenName

+5

Die "Retain-Anzahl" von -1 nach der Zuweisung zeigt an, dass Sie niemals die absolute Retain-Anzahl eines Objekts beachten sollten. Wenn Sie es behalten, sollten Sie es freigeben. Das ist alles. Dass "@" -Strings Retain/Release nicht benötigen, ist ein Implementierungsdetail, auf das man sich technisch nicht verlassen sollte. Aber jeder tut es und alles würde kaputt gehen, wenn sich die Implementierung ändern würde. – bbum

0

Wenn Sie in diesem Fall ein Literal verwenden, ist es nur syntaktischer Zucker, um schnell ein NSString-Objekt zu erstellen. Einmal erstellt, verhält sich das Objekt genau wie ein anderes. Der Unterschied hier ist, dass Ihre Zeichenfolge in das Programm kompiliert wird, anstatt dynamisch erstellt zu werden.

2

Was macht die folgende Zeile eigentlich?

string = @"Some text"; 

Unter der Annahme, dass "string" thusly im Header deklariert wird:

NSString *string; 

Was bedeutet das "=" hier eigentlich tun? Was macht es, um die Referenzzahl zu "string"?

string ist keine Zeichenfolge.

string ist in der Tat auch keine andere Art von Kakao-Objekt.

string ist eine Variable, die Sie erstellt haben, um eine Instanz von NSString zu halten. Der Zuweisungsoperator legt etwas in eine Variable *. In Ihrem obigen Beispiel erstellen Sie eine literale Zeichenfolge und fügen diese in die Variable ein.

Da string eine Variable ist, kein Cocoa-Objekt, enthält sie keine Referenzzählung.

Zuweisen eines Objekts irgendwo kann die Lebensdauer des Objekts in Garbage-Collection-Code (nur auf dem Mac) verlängern. Weitere Informationen finden Sie unter the Memory Management Programming Guide for Cocoa.

* Oder ein C-Array. Verwechseln Sie diese nicht mit Cocoa-Arrays. Sie sind nicht austauschbar und Sie können den Zuweisungsoperator nicht verwenden, um Dinge in eine Cocoa-Sammlung zu stellen (jedenfalls nicht in Objective-C).

Verwandte Themen