Differenza di prestazioni tra la notazione punto e la chiamata al metodo in Objective-C

StackOverflow https://stackoverflow.com/questions/34674

  •  09-06-2019
  •  | 
  •  

Domanda

È possibile utilizzare una notazione punto standard o una chiamata al metodo in Objective-C per accedere a una proprietà di un oggetto in Objective-C.

myObject.property = YES;

O

[myObject setProperty:YES];

C'è una differenza di prestazioni (in termini di accesso alla proprietà)?È solo una questione di preferenza in termini di stile di codifica?

È stato utile?

Soluzione

Notazione punto per l'accesso alle proprietà in Objective-C È un messaggio inviato, proprio come la notazione tra parentesi.Cioè, dato questo:

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

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

Le ultime due righe verranno compilate esattamente allo stesso modo.L'unica cosa che cambia è se una proprietà ha a getter e/o setter attributo specificato;tuttavia, tutto ciò che fa è cambiare il messaggio che viene inviato, non se un messaggio viene inviato:

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

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

Entrambe le ultime due righe verranno compilate in modo identico.

Altri suggerimenti

Guardare articolo da Cocoa is My Girlfriend.Il nocciolo della questione è che non vi è alcuna penalità in termini di prestazioni nell'utilizzo dell'uno rispetto all'altro.

Tuttavia, la notazione rende più difficile vedere cosa sta succedendo con le tue variabili e quali sono le tue variabili.

L'unica volta in cui vedrai una differenza di prestazioni è se non contrassegni una proprietà come "non atomica".Quindi @synthesize aggiungerà automaticamente il codice di sincronizzazione attorno all'impostazione della tua proprietà, mantenendola sicura, ma più lenta da impostare e accedere.

Quindi per lo più probabilmente vorrai definire una proprietà come:

@property (nonatomic, keep) NSString *myProp;

Personalmente trovo la notazione punto generalmente utile dal punto di vista di non dover pensare a scrivere metodi setter corretti, il che non è del tutto banale nemmeno per setter non atomici perché devi anche ricordarti di rilasciare correttamente il vecchio valore.L'uso del codice modello aiuta, ma puoi sempre commettere errori e generalmente è un codice ripetitivo che ingombra le lezioni.

Uno schema di cui essere consapevoli:se definisci tu stesso il setter (invece di lasciare che @synthesize lo crei) e inizi ad avere altri effetti collaterali nell'impostare un valore, probabilmente dovresti rendere il setter un metodo normale invece di chiamare usando la notazione della proprietà.

L'uso semantico delle proprietà sembra essere un accesso diretto al valore effettivo per il chiamante e tutto ciò che varia da ciò dovrebbe quindi essere fatto inviando un messaggio, non accedendo a una proprietà (anche se in realtà entrambi inviano messaggi).

Per quanto ho visto, non c'è una differenza significativa di prestazioni tra i due.Sono ragionevolmente certo che nella maggior parte dei casi verrà "compilato" nello stesso codice.

Se non sei sicuro, prova a scrivere un'applicazione di prova che esegua ciascun metodo un milione di volte circa, cronometrando nel contempo il tempo necessario.Questo è l'unico modo per essere certi (anche se può variare a seconda dell'architettura).

Leggi anche questo post sul blog su Cocoa with Love:

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

Lì l'autore confronta la velocità della funzione di accesso personalizzata e delle notazioni punto per NSManagedObject e non trova alcuna differenza.Tuttavia, l'accesso KVC (setValue:forKey:) sembra essere circa due volte più lento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top