(Objective C) Was ist der Vorteil von @synthesize myvar = _myvar (falls vorhanden)? [Duplikat]

8

Es ist mir nicht völlig klar (abgesehen von der Lesbarkeit des Codes), warum Sie beim Erstellen der Eigenschaft eine interne Variable mit einem Unterstrich-Präfix erstellen möchten.

Da alles intern behandelt wird, warum sollte man das tun, da wir dem Getter und Setter keinen Code hinzufügen?

Und selbst wenn ich dem Getter oder Setter etwas Code hinzufügen muss, sehe ich nicht, warum ich nicht einfach myvar überprüfen kann, anstatt _myvar zu überprüfen und dann myvar zuzuweisen.

Kann mir jemand eine Erklärung geben, außer "tu es, weil das jeder macht?" Ich würde gerne den ganzen Grund verstehen, der hinter dieser Praxis steckt (das scheint ziemlich üblich zu sein, selbst wenn es keinen benutzerdefinierten Code für den Getter und Setter gibt).

Danke!

    
user1006198 16.11.2011, 01:06
quelle

3 Antworten

8

Eine Objective-C-Eigenschaft hat normalerweise eine Backing-Instanzvariable (ich denke, Sie kennen den Unterschied zwischen einer Eigenschaft und einer Instanzvariablen).

Die Eigenschaft kann einen anderen Namen als die Instanzvariable haben.

Sie können beispielsweise eine Instanzvariable namens x mit einer Eigenschaft namens y haben.

Sie können die Eigenschaft y mit der Variablen x synthetisieren, indem Sie:

verwenden %Vor%

Jetzt über den Unterstrich.

Es ist üblich, ein Unterstrichpräfix für Instanzvariablen zu verwenden, um Benennungskollisionen oder Compilerwarnungen (schattierte Variable) zu verhindern, wenn Sie beispielsweise ein Methodenargument mit demselben Namen wie eine Instanzvariable haben.

Das Unterstrichpräfix macht auch deutlich, dass Sie sich auf eine Instanzvariable beziehen.

Wenn Sie das Unterstrichpräfix für Instanzvariablen verwenden, können Sie den Namen ohne den Unterstrich in Methodenargumenten, Stapelvariablen usw. verwenden.

Aber wenn Sie eine Eigenschaft verwenden, möchten Sie normalerweise nicht, dass der Benutzer einen Unterstrich schreibt.

Sie haben also normalerweise eine x Eigenschaft für eine _x Instanzvariable.

Deshalb schreibst du:

%Vor%

Nehmen wir ein Beispiel:

%Vor%

Das ist ziemlich häufig ... Aber stellen Sie sich das jetzt in der Implementierung vor:

%Vor%

Wir haben eine Namenskollision.

Innerhalb unserer Methode verweist x auf das Argument der Methode. Und es gibt keine schöne Möglichkeit, auf die Instanzvariable x zuzugreifen.

Abhängig von den Warnhinweisen Ihres Compilers kann dies auch eine Warnung ( -Wshadow ) erzeugen.

Wenn Sie für Ihre Instanzvariable ein Unterstrichpräfix verwenden, ist alles einfach:

%Vor%

Kein Konflikt, keine Namenskollision, verbessertes Lesen ... Nur ein schöner Weg ...

    
Macmade 16.11.2011, 01:13
quelle
9

Ich habe mich das schon oft gefragt. Interessiert an der Antwort anderer Leute, aber ein Grund, den ich gefunden habe, ist, dass es dich zwingt zu bemerken, wenn du direkt auf den Ivar zugreifst, wenn du den Getter / Setter benutzen solltest.

self.myvar = @"blah"; und _myvar = @"blah";

vs

self.myvar = @"blah"; und myvar = @"blah";

Es ist einfach, die self. versehentlich zu verlassen ... es ist viel schwieriger, die _ durch Zufall zu setzen.

    
Kenny Winker 16.11.2011 01:16
quelle
1

Wenn man eine Eigenschaft von sich selbst benutzt, vergisst man leicht das "Selbst":

%Vor%

gegen

%Vor%

Wenn die Eigenschaft und der Ivar identisch benannt sind, werden die letzteren Fälle ohne Beanstandung kompiliert und scheinen zu funktionieren ... bis sie es nicht tun, und Sie erhalten einen seltsamen, schwer zu reproduzierenden Edge Case Bug.

>

Wenn der ivar einen etwas anderen Namen hat, sagen wir mit angehängtem _ , stoppt der Compiler Sie und lässt Sie explizit entscheiden: Soll ich hier auf die Eigenschaft verweisen, oder direkt auf die ivar?

(Alles, was ich gesagt habe, bin ich faul und tue oft @synthesize field; und ersetze es später mit @synthesize field = field_; , wenn ich tatsächlich den eindeutigen ivar brauche, sagen wir, wenn es Zeit für das Schreiben von benutzerdefinierten Sätzen ist.)

    
rgeorge 16.11.2011 01:18
quelle

Tags und Links

yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warningyii\base\ErrorException

PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: /usr/lib64/php/modules/mongodb.so (/usr/lib64/php/modules/mongodb.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/mongodb.so.so (/usr/lib64/php/modules/mongodb.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '339866',
    'url' => 'objective-c-what-is-the-advantage-of-doing-synthesize-myvar-myvar-if-any',
];

$_SESSION = [
    '__flash' => [],
];