2016-04-01 11 views
2

Was ist hier vorzuziehen und warum?__weak typeof (self) weakself = self ODER __weak MyObject * weakSelf = self?

__weak typeof(self) weakSelf = self; 

oder

__weak MyObject *weakSelf = self; 

Offensichtlich __weak id weakSelf = self; würden die am wenigsten wünschenswert sein, da wir nicht die Typprüfung bekommen, ist das richtig?

Allerdings zwischen den ersten beiden ... was ist wünschenswert und warum?

Auch einen Grund, __typeof anstelle von typeof zu verwenden, wenn clam unterstützt typof verwenden?

+0

Es ist keine Frage auf der Grundlage von Meinungen. Diese beiden Aussagen werden vom Compiler anders gehandhabt, so dass beide Anwendungen ihre Vor- und Nachteile haben. –

+0

@ MichałCiuba Sie haben Vor- und Nachteile, aber es gibt keine definitive Antwort. Unterschiedliche Menschen werden Vor- und Nachteile lesen und anders wählen. Daher basiert es auf meiner Meinung. – Sulthan

Antwort

3

ich es so schreibe dies vor kurzem habe beginnen:

__typeof(self) __weak weakSelf = self; 

die __typeof Version verwenden, können Sie einen Code-Schnipsel verwenden, so dass es viel schneller ist, und wird auch im gesamten Code konsistent sein.

Dies ist nicht die übliche Form, wie die meisten Menschen die __weak Variable Qualifier am Anfang, aber nach den Dokumenten hier: https://developer.apple.com/library/mac/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html die Variable Qualifier geht nach dem Typ.

Einmal im Inneren des Blocks, die ich benutze:

__typeof(weakSelf) __strong strongSelf = weakSelf; 
if (!strongSelf) return; 

wieder einen starken Bezug zu erhalten.

Beide sind Code-Schnipsel, so dass ich nicht viel tippen oder mich an die genaue Syntax erinnern muss.

+0

Können Sie das Code-Snippet näher erläutern? Können diese kleinen Makros in der xcode-IDE erstellt werden? –

+0

Sicher, Xcode hat einige Code-Snippet-Unterstützung enthalten, aber ich bevorzuge Dash verwenden https://itunes.apple.com/us/app/dash-3-api-docs-snippets/id449589707?mt=12&uo=4&at=11lMGu&pt = 17255 & ct = SO, da ich es auch für Dokumente verwende. Sie können ein Schlüsselwort einrichten, das beim Eingeben automatisch durch das Snippet ersetzt wird. Also verwende ich 'weakSelf #' und 'strongSelf #' für diese beiden. Das ist alles, was ich eingeben muss, und ich bekomme die komplizierte Syntax für mich konsequent durch. Ich habe auch Schnipsel für das Einrichten von allgemeinen Blöcken usw., da es ein Schmerz ist, sich an die Syntax für diese zu erinnern. –

+0

danke. Außerdem muss im Block einmal definiert werden. Das wäre der Standard korrekt? Oder platzierst du das mehr für Symmetrie? –

1

Die erste ist bequemer, weil der Code unabhängig von der Klasse derselbe ist. Sie können ein Xcode-Code-Snippet verwenden, um die Codezeile typeof mit weniger Tastenanschlägen einzufügen. Sie haben auch weniger Arbeit zu tun, wenn Sie den Namen Ihrer Klasse ändern.

Ich kenne keine Nachteile der Verwendung der typeof-Version außer vielleicht, dass es ein wenig schwieriger zu verstehen ist.

If you use __typeof__ instead of typeof, your code will compile regardless of the compiler's dialect setting.

-3

Wie Sie wahrscheinlich wissen __typeof__() „erweitert“ auf die konkrete Art des Arguments. Wenn das Argument self ist und der konkrete Typ self ist MyObject (das ist Ihr Fall), ist es einfach das gleiche.

So ist die erste Form hat einfach eine andere indirection mit den üblichen Vor- und Nachteile von Indirekt:

  • Die indirected Form mehr flexibel ist, weil der Indirektionsoperator Änderungen folgt.

  • Die abgeleitete Form ist weniger lesbar, weil der Leser die Umleitung in seinem Kopf verstehen muss.

Persönlich würde ich die zweite Form bevorzugen. Aber noch wichtiger: Ich persönlich würde es vorziehen, meine Zeit für wichtigere Fragen zu verschwenden. ;-)

Würden Sie schreiben:

__typeof__(self) copy = [self copy]; 

würde ich nicht.

Verwandte Themen