__starke und __weiche Schlüsselwortplatzierung - Objective-C

8

Der Compiler scheint mit den beiden folgenden Deklarationen kein Problem zu haben:

%Vor%

Gibt es einen Unterschied zwischen den beiden? Ist das Verhalten wie das const keyword ?

Ich frage, weil die Xcode-Warnung im Allgemeinen darauf hindeutet ...

  

SomeDataType * __weak / __stark

... wenn du etwas vermasselt hast. Also habe ich versucht, diesem Muster zu folgen, aber ich fragte mich, ob es überhaupt einen Unterschied gab.

    
edelaney05 18.01.2012, 17:29
quelle

2 Antworten

13

Nein, es gibt keinen Unterschied. Mit dem Schlüsselwort const gibt es mehrere Dinge, auf die es in einer Deklaration angewendet werden könnte. Es könnte sich auf den Zeiger beziehen, oder es könnte auf den Wert angewendet werden, auf den gezeigt wird.

Eigentumsqualifizierer sind nur für Zeiger auf Objekte sinnvoll. Das Objekt selbst kann nicht "stark" oder "schwach" sein; es ist der Zeiger auf das Objekt, der stark oder schwach ist. ARC ist nur sinnvoll, wenn es direkt auf Zeiger-zu-Objekt-Typen angewendet wird und beeinflusst, wie sich die Lebensdauer dieses Zeigers auf die Lebensdauer des Objekts auswirkt.

Angesichts der Tatsache, dass es nie Unklarheiten darüber gibt, wofür das Eigentumsqualifikationsmerkmal verwendet werden könnte, erlaubt die ARC-Spezifikation die Platzierung des Eigentumsqualifizierers irgendwo in der Definition des Verweises auf das Objekt. Beide Beispiele sind gleichermaßen gültig. In ähnlicher Weise bedeuten alle folgenden Punkte dasselbe:

%Vor%

Beachten Sie, dass sich der Compiler darüber beschwert:

%Vor%

Dies liegt daran, dass Sie die Definition von Zeiger zu Objekt verlassen haben. Du könntest das als (NSError *)* __autoreleasing someObject; parsen. Zu dem Zeitpunkt, an dem Sie zum zweiten * gelangen, haben Sie den Typ des Zeigers bereits definiert, sodass __autoreleasing keinen Sinn ergibt. Überall innerhalb der Definition des Zeigertyps ist in Ordnung, aber sobald Sie auf den Zeiger-zu-Zeiger-Typ gehen, dann beziehen Sie sich auf etwas anderes, und es macht keinen Sinn mehr.

    
BJ Homer 18.01.2012, 17:41
quelle
6

There ist ein Unterschied, wenn Sie

haben %Vor%

weil das __weak nur verwirrend auf die erste Variable angewendet wird. (Das ist ein ähnlicher Fehler wie der Rookie

%Vor%

was natürlich auch nicht als "erwartet" funktionieren wird.

    
marc hoffman 07.10.2013 16:45
quelle