@ Eigenschaft Definitionen mit ARC: stark oder beibehalten?

80

Bei Verwendung von Xcode 4.2 und ARC stelle ich fest, dass der automatisch generierte Code für ein NSManagedObjectStandbild für Eigenschaften wie folgt lautet:

@property (nonatomic, retain) NSString * someString;

1) Sollte retainjetzt nicht durch strongoder ersetzt werden weak?

2) Warum wird der automatisch generierte Code immer noch verwendet? retain

3) Wofür ist der richtige Ersatz retainin dieser Eigenschaftserklärung?

Ich debugge gerade ein Problem mit NSFetchRequestund dachte, dies könnte die Ursache des Problems sein. Gedanken?

one09jason
quelle
Sie sollten die Antwort jetzt akzeptieren.
Rivera

Antworten:

110

1) Sollte nicht behalten durch jetzt stark oder schwach ersetzt werden?

Nein. Sie können Retain nicht durch schwach ersetzen. Sie sind anders. Und stark ist ein 100% iges Synonym für behalten; sie sind identisch. Sie können beides verwenden, daher gibt es hier kein "sollte". Sie können Retain durch Strong ersetzen, wenn Sie möchten, müssen dies aber nicht.

2) Warum verwendet der automatisch generierte Code weiterhin Retain?

Warum nicht? Siehe (1). Beibehalten ist korrekt, daher gibt es kein Problem.

3) Was ist der richtige Ersatz für die Aufbewahrung in dieser Eigenschaftserklärung?

Es ist nicht erforderlich, die Halterung zu ersetzen.

Ich debugge derzeit ein Problem mit NSFetchRequest und dachte, dies könnte die Ursache des Problems sein. Gedanken?

Ist es nicht.

matt
quelle
9
Ich würde jedoch davon ausgehen, dass es für eine Community, die (und zu Recht!) Von Standards und der Einhaltung von Apple Way (s) besessen ist, unterdurchschnittlich ist, nur synthetisierte Modelle beizubehalten. Ich wechsle zu stark, nur um pedantisch zu sein. Zum einen erleichtert es ein bisschen, ein großes Projekt auf falsche Syntax zu überprüfen, neben einem halben Dutzend anderer kleiner Dinge.
Eric Goldberg
12
Ich weiß nicht genau, was emotionale Architektur ist. Können Sie ein Beispiel im "kalten, klaren Tageslicht" geben? ;-) false und NO sind Synonyme, aber wir verwenden NO gemäß Konvention in Objective-C. Es gibt Gründe, konsequent zu sein. inkonsistent zu sein ist in Ordnung, aber die Last, Wertigkeit zu beweisen, liegt bei der einen, die gegen die Konvention verstößt, und nicht bei der, die daran festhält.
Eric Goldberg
9
Bei allem Respekt hat @EricGoldberg einen Punkt: Konventionen sind wichtig. Und weil Sie sich __strongan anderen Stellen in Ihrem Code befinden (es gibt keine __retain), möchten Sie möglicherweise aus Gründen der strongKonsistenz zu using wechseln . Dies ähnelt dem konsistenten Einrücken Ihres Codes, auch wenn der Code ohne diesen Code einwandfrei funktioniert.
Dan Rosenstark
3
@matt: Wenn Sie sich meinen ursprünglichen Kommentar ansehen, den Sie mir vorgeworfen haben, "emotional" zu codieren (was auch immer das ist), werden Sie sehen, dass ich die Wörter "positiv" und "nur um pedantisch zu sein" verwende. Ich schlage tatsächlich vor, "sollte" und nicht "ist".
Eric Goldberg
1
Bei der gesamten Programmierung geht es um Redewendungen. Es gibt keine anderen Probleme. Alle Programmierung ist ein Synonym. Bei der gesamten technischen Programmierpraxis geht es darum, die aktuelle Sprache zu verwenden, um dem Code für den Client einen Mehrwert zu verleihen.
Fattie
40

Alle drei Fragen in einer beantworten: retainund strongsind synonym miteinander, also sind beide richtig. In der Dokumentation heißt es

retainimpliziert __strongEigentum

strongimpliziert __strongEigentum

Phlibbo
quelle
Danke für die Antwort. Ich habe das Apple-Dokument auf ARC gelesen. Ich verstehe, dass behalten zu stark übersetzt. Dies erklärt jedoch nicht, warum der Code, der von Xcode beim Erstellen neuer NSManagedObject (s) automatisch generiert wird, Ihnen @property (nichtatomar, beibehalten) gibt
one09jason
3
Es sei denn, ich vermisse hier etwas, das erklärt es perfekt. Der von Xcode erstellte Code ist korrekt, da die Beibehaltung genauso stark funktioniert. Wo ist also Ihre Frage?
Phlibbo
6
Wenn Sie das ARC-Refactoring für Ihr Projekt ausführen, werden alle diese retains in strongs konvertiert . Mein Eindruck ist also, dass dies strongdas bevorzugte Attribut ist, aber der NSManagedObject-Generator wurde nicht aktualisiert. Aber das ist nur eine Vermutung; Vielleicht hält niemand bei Apple die Unterscheidung für wichtig.
Theorie
4

Vor ARC müssen Sie ein Objekt freigeben, das beibehalten wird. Das heißt behalten hat Gegenstück. Nach ARC müssen Sie nicht freigeben. Also stark verwenden. Es ist ein visueller Hinweis, den Sie nicht als Release bezeichnen müssen.

user2488343
quelle
3

"behalten" ist gleich "stark".

"stark" wird zum Beispiel verwendet:

@property (nonatomic, strong) NSString * someString;

Und "__strong" wird zum Beispiel verwendet:

-(void) someMethod
{
    __strong NSString* vStr = [[NSString alloc] initWithString:@"some string"];
}

Auf Apple Docs. sagt:

Eigenschaftsattribute

Die Schlüsselwörter schwach und stark werden als neue deklarierte Eigenschaftsattribute eingeführt, wie in den folgenden Beispielen gezeigt.

// The following declaration is a synonym for: @property(retain) MyClass *myObject;
property(strong) MyClass *myObject;

Apple doc. http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

Alex
quelle