Mein Verständnis ist, dass Xcode 4.5+ wird eine Standard-Accessor „_variableName“ erstellen, die auf self.variableName und die einzigen Gründe, entspricht nicht verwenden „@synthesize Variablenname“ ist eine Verwechslung zwischen Ivars zu vermeiden und weitergegeben-in Variablen, richtig?
In diesem Fall _variableName
ist nicht die Accessor, es ist ein Ivar, der automatisch vom Compiler erzeugt wird und in dem automatisch @synthesized Getter und Setter verwendet. Im Allgemeinen wird es als am besten angesehen, Zugriffsmethoden zu verwenden, wann immer dies möglich ist (d. H.), so dass Dinge wie Schlüsselwertbeobachtung und Bindungen für diese Eigenschaft funktionieren.
Wenn Sie direkt auf einen ivar zugreifen, wird über direkten Speicherzugriff auf dieselbe Weise zugegriffen wie auf Daten in einer Struktur. Es nimmt einfach den Zeiger für das Objekt, das den ivar besitzt, verschiebt die Speicheradresse und versucht, in den Speicher an dieser Stelle zu lesen oder zu schreiben. Mit Punktnotation (self.variableName
) ruft die Accessormethoden diese Eigenschaft zu setzen oder zu erhalten und kann auf dem Weg, wie eine Reihe von verschiedenen Dingen tun:
1) Sperren: Wenn die Eigenschaft verwendet werden soll in mehrere Threads und ist eine atomic
Eigenschaft, die Laufzeit wird automatisch einige Sperren, um sicherzustellen, dass die Eigenschaft nicht gleichzeitig von mehreren Threads zugegriffen wird. Wenn Ihr Objekt nicht für mehrere Threads verwendet werden soll, können Sie den nonatomic
Hinweis in Ihrer Eigenschaftsdeklaration angeben, sodass die synthetisierten Accessoren das Sperren überspringen.
2) Schlüsselwert Benachrichtigungen: Die Standardsetzer für Eigenschaften nennen -willChangeValueForKey:
und -didChangeValueForKey:
, welche Benachrichtigungen sendet, wenn die Eigenschaft geändert wird. Dies ist notwendig, damit alles ordnungsgemäß aktualisiert werden kann, wenn Bindungen verwendet werden, und für jede andere Schlüsselwertbeobachtung.
3) Benutzerdefiniertes Accessor-Verhalten: Wenn Sie Ihre eigenen Setter und Getter schreiben, irgendwelche benutzerdefinierten Sachen, die Sie in denen implementieren.
Technisch gesehen ist der direkte Zugriff auf den ivar schneller als die Verwendung von Accessoren, aber es gibt nur sehr wenige Situationen, in denen ein signifikanter Leistungsunterschied auftritt und wahrscheinlich eine vorzeitige Optimierung vorliegt. Selbst wenn Sie nicht das Gefühl haben, dass Sie die oben genannten Vorteile sofort nutzen würden, ist es wahrscheinlich besser, die Accessoren trotzdem zu verwenden, damit Sie nicht jedes Mal, wenn Sie sich später entscheiden, etwas von dieser Funktionalität benötigen auf diese Variable zuzugreifen (und möglicherweise unerwartete neue Fehler in dem Prozess zu erzeugen).
Wenn Sie direkt auf Ivars zugreifen und Ihre Klasse in Kategorien oder Unterklassen umgestalten, wird es unordentlich, weil Sie den ivar normalerweise als @protected
Variable deklarieren müssen. Sie müssten dies nicht tun, wenn Sie die Accessoren verwenden.
Im Allgemeinen versuche ich nur auf die Ivars direkt in init
, dealloc
zugreifen, und die Accessor der Eigenschaft. Viele Ingenieure gehen nach dieser Faustregel, weil manchmal die benutzerdefinierten Dinge, die in Accessoren passieren, zu unerwartetem Verhalten führen können, während das Objekt init
'ing oder dealloc
' ing ist. Zum Beispiel, wenn irgendetwas in den Accessoren etwas zu retain
oder release
Ihr Objekt verursacht oder sogar eine schwache Nullreferenz darauf bildet, wird es einen Absturz verursachen, wenn es in dealloc
verwendet wird.
Und hier ist eine andere 16: http://stackoverflow.com/q/5582448/ http://stackoverflow.com/q/6049269/ http://stackoverflow.com/q/2371489/ http://stackoverflow.com/q/7174277/ http://stackoverflow.com/q/5659156 http://stackoverflow.com/q/837559/ http://stackoverflow.com/q/6146244/ http: //Paketüberfluss.com/q/10651535/ http://Stackoverflow.com/q/6124109/ http://StackOverflow.com/Q/8145373/ http://StackOverflow.com/Q/3521254/ http: // stackoverflow.com/q/6064283/ http://stackoverflow.com/q/9696359/ http://stackoverflow.com/q/5521499/ http://stackoverflow.com/q/5466496/ http: //stackoverflow.com/q/2114587/ –
Mein schlechtes. Ich denke nicht daran, nach 'unterstrichen' zu suchen. Das heißt, einige der möglichen Überprüfungen werden stichprobenartig überprüft. Ich habe keine/newbie-proof-Erwähnung der möglichen Probleme mit Schlüsselwertbeobachtung, Bindungen und threadsicherem Zugriff (atomar) gesehen, wenn _variableName vs. self verwendet wird .Variablennamen. Ein (4088801) hat ein potenzielles Problem erwähnt, wenn das Objekt, auf das in _variableName verwiesen wird, freigegeben ist und stattdessen die Verwendung von self.variableName empfohlen wird. –
Wenn Sie ein bestimmtes Problem sehen, das in einer der vielen Instanzen der allgemeinen Frage übersehen wird, sollten Sie sich frei dazu äußern. Es hat jedoch wenig Wert, dass diese Informationen zufällig in einer anderen Kopie vergraben werden. –