Was ist der richtige Weg, um zu erklären, eine readonly-Eigenschaft für ios mit ARC
Ich bin neu in der iOS-Entwicklung im Allgemeinen und haben nie befasst mit manuellem reference counting (retain, release, autorelease). Als solche, die ich nicht haben ein gutes Verständnis von dem, was Magie ARC durchführt.
Ich dachte, ich Verstand, bis ich gefragt wurde, welche Art von Eigentum ( weak
, strong
, assign
etc) sollte gegeben werden, um eine readonly-Eigenschaft auf ein Objekt gerichtet, wie:
@property (readonly,nonatomic) NSString* name;
Ich hier gelesen habe
Fragen über eine readonly - @Immobilien in BOGEN das verlassen der strong
/weak
nicht wirklich kompilieren, es sei denn, Sie geben einen Rückhalt variable, wenn Sie @synthesize
Eigentum, ich habe Sie nur so geschehen zu sein, die Angabe background-ivar wie diese:
@synthesize name = _name;
Jetzt verstehe ich, dass der Standard-Lebenszeit des qualifier' einer Variablen ist stark, von hier: http://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011226-CH1-SW4
So, um zu schneiden eine lange Geschichte kurz - ich bin indirekt die Definition meiner Eigenschaft als (readonly,nonatomic,strong)
als _name
ivar ist implizit deklariert als __strong
.
Habe ich ein paar Fragen:
-
Ist
strong
richtigen Leben qualifier verwenden? Ich gehe davon aus, dass es ist, sonst wird das Objekt sichern meineNSString*
wäre nicht im Besitz überall und würde somit automatisch freigegeben (aus dem Java-land-dies macht Sinn, da alle Referenzen sind starke Standard). -
Gibt es noch andere Modifikatoren, die Sinn machen in dieser situation, wie
copy
oderassign
? -
Tut der Deklaration der Eigenschaft als
(readonly,nonatomic,strong)
und(readonly,nonatomic)
keinen Unterschied machen, mit dem code, der verbraucht Eigentum? zB. nicht zu deklarieren, ohne diestrong
keyword Ursache der Objekt-Zeiger gespeichert werden, wie__unsafe_unretained
wo diestrong
- Eigenschaft gespeichert werden, in einer__strong
Zeiger?
Dank!
BEARBEITEN
So wie ich das jetzt verstehe, gilt das folgende für readonly-Eigenschaften:
- Für nicht-NSObject* Typen (int, float, void*, etc) verwenden
(readonly, assign)
. - Für Objekt-Pointer, verwenden Sie
(readonly, strong)
oder(readonly, copy)
- diese Funktion das gleiche für readonly-Eigenschaften, aber Sie können die copy-Semantik bei Verlängerung/Unterklasse und deklarieren Sie die Eigenschaft wiereadwrite
. - Für den Objekt-Zeiger,
(readonly, weak)
macht nur Sinn, wenn Sie gehen, um die Speicherung einer bereits schwachen Zeiger in dieser Eigenschaft (die Zeiger müssen stark sein, an anderer Stelle oder das Objekt wird freigegeben).
- Beachten Sie, dass zu "starke" impliziert ist, so dass, wenn Sie erweitern eine readonly angegeben
(readonly)
mit(strong)
es wird funktionieren, aber(copy)
nicht. Stattdessen würden Sie sehen, "ARC verbietet Synthese eine Eigenschaft ... mit unbekannter Eigentums-oder Speicher-Attribut." In diesem Fall müssen Sie explizit die header-definition(readwrite, copy)
. Dieser stolperte, mich für ein paar Minuten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
strong
richtig ist zu verwenden, wenn Sie möchten, um eine starke (Besitz) Bezug zu was auch immer es ist, dass Sie zeigen. In der Regel, Sie wollen starke, aber um zu verhindern, dass zirkuläre Referenzen (insbesondere in Eltern - /Kind-Beziehungen, wo, wenn der übergeordnete Punkte, um das Kind und das Kind Punkte, die auf der übergeordneten, die Sie nie entlassen werden), die Sie manchmal brauchen die schwachen Referenzen. Auch, wenn Sie möchten, um einen Zeiger auf ein Objekt, das Sie nicht besitzen, aber wollen, dass es, um gültig zu sein nur so lange, wie es existiert, dann wollen Sie mit einem schwachen Zeiger, denn wenn er freigegeben ist, durch den Eigentümer, der Mauszeiger automatisch eingestelltnil
und nicht zeigen zu Speicher, dass sollte es nicht sein.assign
mit skalaren Werten, und ist der Standard-setter.copy
macht Sinn, wenn Sie möchten, um automatisch eine Kopie des Objekts, und legen Sie den Zeiger auf die Kopie statt auf das ursprüngliche Objekt. Es macht nur Sinn, wenn Sie einen besonderen Bedarf (in der Regel, weil Sie nicht wollen, das Objekt zu mutieren, die auf Sie).Den link, den Sie zur Verfügung gestellt, die zeigt, dass __stark ist der Standard (und daher Sie don ' T brauchen, um es zu spezifizieren) bezieht sich auf Variablen und nicht zu deklarierten Eigenschaften. Die Standardeinstellung für die deklarierten Eigenschaften ist
assign
also es wird sicherlich einen Unterschied machen. Wenn Sie wollenassign
jedoch macht es keinen Unterschied, ob Sie es angeben oder nicht (andere als nur klar zu sein, dass es das ist, was Sie wollte).BEARBEITEN: Aber, wie Jacques wies darauf hin, das ändert sich mit LLVM 3.1 und der Standard ist ändern von
assign
zustrong
. In diesem Fall macht es absolut keinen Unterschied, ob oder nicht Sie gebenstrong
und kann es weglassen, wenn Sie wollen. Ich persönlich denke, dass es gut ist, zu buchstabieren Sie es aus (vor allem, da es einen Konflikt gibt zwischen den verschiedenen Versionen), so dass jeder sich den code auf der gleichen Seite. Andere mögen widersprechen in diesem Punkt aber. 🙂Ich würde vorschlagen, das Lesen der Deklarierten Eigenschaften Abschnitt Die Objective-C Programmiersprache hier:
<document removed by Apple with no direct replacement>
.Einen zusätzlichen Punkt: Eigenschaften bekommen können erneut deklariert von
readonly
zureadwrite
. Zum Beispiel, eine Unterklasse kann eine nur-lese-Eigenschaft von der Superklasse, die Lesen und schreiben, ähnlich wie viele Cocoa-Klassen-Unterklassen hinzufügen Veränderbarkeit. Ebenso kann eine Eigenschaft sein, öffentlich zu Lesen-aber nur die class redeclare es Lesen-schreiben für den internen Gebrauch in eine Klasse Erweiterung. Also, wenn die Klasse stellt die eigene Immobilie kann es von Vorteil eine synthetisierte setter, der ist Speicher-management richtig und strahlt entsprechende Key-Value Observing Benachrichtigungen ändern.Wie die Dinge derzeit stehen, werden alle anderen Attribute, die die Eigenschaft haben, konsequent zu sein. Es ist denkbar, dass der compiler entspannen konnte diese Anforderung. (Einige halten es für einen Fehler.) Das ist sowieso ein Grund zu erklären
readonly
Eigentum mit Besitz-Attribut wiestrong
,copy
oder schwach – so dass es passt auf diereadwrite
nochmaliges deklarieren einer anderswo.Hinsichtlich Ihrer Frage 3 sind, werden Sie gefragt, ob die Eigentums-qualifier-code wirkt sich auf die Aufrufe der getter? Nein, tut es nicht.
Diese 2 Zeilen code für mich arbeiten:
.h-Datei:
.m-Datei: