Frage

Sie können eine Standardpunktnotation oder einen Methodenaufruf in Objective-C verwenden, um auf eine Eigenschaft eines Objekts in Objective-C zuzugreifen.

myObject.property = YES;

oder

[myObject setProperty:YES];

Gibt es einen Unterschied in der Leistung (hinsichtlich des Zugangs zur Immobilie)?Ist es nur eine Frage der Präferenz hinsichtlich des Codierungsstils?

War es hilfreich?

Lösung

Punktnotation für den Eigenschaftszugriff in Objective-C Ist eine Nachricht senden, genau wie Klammernotation.Das heißt, vorausgesetzt:

@interface Foo : NSObject
@property BOOL bar;
@end

Foo *foo = [[Foo alloc] init];
foo.bar = YES;
[foo setBar:YES];

Die letzten beiden Zeilen werden genau gleich kompiliert.Das Einzige, was sich daran ändert, ist, wenn eine Immobilie über eine verfügt getter und/oder setter Attribut angegeben;Es ändert jedoch lediglich, welche Nachricht gesendet wird, nicht, ob eine Nachricht gesendet wird:

@interface MyView : NSView
@property(getter=isEmpty) BOOL empty;
@end

if ([someView isEmpty]) { /* ... */ }
if (someView.empty) { /* ... */ }

Die beiden letzten Zeilen werden identisch kompiliert.

Andere Tipps

Kasse Artikel von Cocoa is My Girlfriend.Der Kern davon ist, dass es keine Leistungseinbußen gibt, wenn man das eine gegenüber dem anderen verwendet.

Allerdings macht es die Notation schwieriger zu erkennen, was mit Ihren Variablen passiert und was Ihre Variablen sind.

Einen Leistungsunterschied werden Sie nur feststellen, wenn Sie eine Eigenschaft nicht als „nichtatomar“ markieren.Dann fügt @synthesize automatisch Synchronisierungscode rund um die Einstellung Ihrer Eigenschaft hinzu und sorgt so dafür, dass sie threadsicher bleibt – allerdings ist die Einstellung und der Zugriff langsamer.

Daher möchten Sie wahrscheinlich meistens eine Eigenschaft wie diese definieren:

@property (nichtatomar, beibehalten) NSString *myProp;

Persönlich finde ich die Punktnotation im Allgemeinen nützlich, da Sie nicht darüber nachdenken müssen, korrekte Setter-Methoden zu schreiben, was selbst für nichtatomare Setter nicht ganz trivial ist, da Sie auch daran denken müssen, den alten Wert ordnungsgemäß freizugeben.Die Verwendung von Vorlagencode ist zwar hilfreich, aber Sie können immer Fehler machen und es ist im Allgemeinen der sich wiederholende Code, der den Unterricht überfüllt.

Ein Muster, das Sie beachten sollten:Wenn Sie den Setter selbst definieren (anstatt ihn von @synthesize erstellen zu lassen) und andere Nebenwirkungen beim Festlegen eines Werts haben, sollten Sie den Setter wahrscheinlich zu einer normalen Methode machen, anstatt ihn mit der Eigenschaftsnotation aufzurufen.

Die semantische Verwendung von Eigenschaften scheint für den Aufrufer ein direkter Zugriff auf den tatsächlichen Wert zu sein, und alles, was davon abweicht, sollte daher über das Senden einer Nachricht und nicht über den Zugriff auf eine Eigenschaft erfolgen (obwohl beide in Wirklichkeit Nachrichten senden).

Soweit ich gesehen habe, gibt es keinen signifikanten Leistungsunterschied zwischen den beiden.Ich bin ziemlich sicher, dass es in den meisten Fällen auf den gleichen Code „kompiliert“ wird.

Wenn Sie sich nicht sicher sind, versuchen Sie, eine Testanwendung zu schreiben, die jede Methode etwa eine Million Mal ausführt und dabei die dafür benötigte Zeit einschätzt.Nur so kann man sicher sein (obwohl es je nach Architektur variieren kann).

Lesen Sie auch diesen Blogbeitrag zu Cocoa with Love:

http://cocoawithlove.com/2008/06/speed-test-nsmanagedobject-objc-20.html

Dort vergleicht der Autor die Geschwindigkeit von benutzerdefinierten Accessoren und Punktnotationen für NSManagedObject und stellt keinen Unterschied fest.Allerdings scheint der KVC-Zugriff (setValue:forKey:) etwa doppelt so langsam zu sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top