2012-06-14 4 views
8

Es ist seltsam, dass in Big Nerd Ranch iOS 5 Buch (S.73) und Programmierung iOS 5 Buch (O'Reilly, S.314) (update: sogar Kochan Objective-C Buch vierte Ausgabe), im Kontext von ARC sagen sie, dass das Standardeigenschaftsattribut assign ist ... Aber Apple's documentation sagt, dass der Standard strong ist.In Objective-C mit ARC, ist es wahr, dass wir normalerweise nicht-atomare Eigenschaften als Eigenschaften angeben müssen?

Ich habe auch versucht, ein einfaches Programm, in dem, wenn ich das Programm funktioniert ok, nicht strong angeben, und wenn ich strong angeben, funktioniert es gleich, und wenn assign stattdessen verwendet wird, zeigt der Compiler eine Warnung, so dass es scheint der Standard ist in der Tat strong.

Also, wenn die meiste Zeit wollen wir

@property (nonatomic, readwrite, strong) NSMutableArray *foo; 

dann können wir nur schreiben

@property (nonatomic) NSMutableArray *foo; 

wie die beiden anderen (readwrite und strong) sind Standardwerte?

+0

Zuordnung wird nur mit keiner ARC verwendet, weshalb Sie die Compiler-Warnung erhalten. – Darren

+0

, aber die Warnung ist nicht über 'assign' in ARC. Es geht darum, dass das Objekt früher als normalerweise erwartet freigegeben wird. –

+0

'assign' ist dasselbe wie' unsafe_unreteted' unter ARC. Mit anderen Worten, das Verhalten ist das gleiche wie bei der Zuweisung unter MRC. –

Antwort

12

Readwrite und stark, sind in der Tat die Standardeinstellung unter ARC *. Bei manueller Referenzzählung war Assign der Standardwert. Ich bevorzuge es, diese explizit zu spezifizieren, weil es deutlicher macht, welche Parameter die @ Eigenschaft ist, anstatt sich darauf zu verlassen, dass die Person, die den Code liest, weiß, was die Standardwerte sind.

* strong ist der Standardwert, wenn Sie entweder den Compiler eine Instanzvariable für sich synthetisieren lassen oder eine Instanzvariable ohne explizites Besitzqualifikationsmerkmal deklariert haben (in diesem Fall ist der ivar standardmäßig __strong). Andernfalls entspricht der Standardeigentümerschaftstyp dem Besitzqualifizierer in der Ivar-Deklaration. Wenn Sie also explizit einen Ivar mit __weak deklarieren, dann deklarieren Sie eine Eigenschaft @property ohne einen Eigentümerqualifikator, die synthetisierte Eigenschaft ist schwach. Dies ist alles in der Clang ARC documentation dokumentiert.

+0

das ist wahr ... wenn andere Leute den Code lesen ... dann spezifizierst du einfach 'nichtatomisch, stark'? –

+0

übrigens ... selbst Kochans Objective-C-Buch sagt, der Standard ist nicht "stark" ... also hat sich vielleicht vor kurzem etwas geändert ... –

+0

Wie in meiner Antwort angegeben, ist strong der Standard unter ARC. Zuweisung ist die Standardeinstellung unter manueller Speicherverwaltung (d. h. nicht-ARC), also ja, die Standardeinstellung wurde effektiv für neuen Code geändert, als ARC eingeführt wurde. Bei der Deklaration von Eigenschaften gebe ich _always_ explizit das Eigentumsrecht an. –

Verwandte Themen