2008-08-29 11 views

risposta

19

La notazione dei punti per l'accesso alla proprietà in Objective-C è un messaggio di invio, proprio come notazione della 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 si compileranno esattamente allo stesso modo. L'unica cosa che cambia è se una proprietà ha un attributo getter e/o setter specificato; Tuttavia, tutto ciò che fa è cambiare ciò che il messaggio 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 compilerà in modo identico.

0

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

Se non si è sicuri, provare a scrivere un'applicazione di prova che esegue ciascun metodo un milione di volte o giù di lì, per tutto il tempo necessario per il tempo necessario. Questo è l'unico modo per essere certi (anche se può variare a seconda dell'architettura).

4

Check out article from Cocoa is My Girlfriend. L'essenza di ciò, è che non vi è alcuna penalità di prestazioni nell'usare l'una sull'altra.

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

4

L'unica volta che vedrete una differenza di prestazioni è se non contrassegnate una proprietà come "non anatomica". Quindi @synthesize aggiungerà automaticamente il codice di sincronizzazione attorno all'impostazione della tua proprietà, mantenendola thread-safe - ma più lenta per impostare e accedere.

Così per lo più probabilmente vuole definire una proprietà come:

@property (nonatomic, mantenere) NSString * myProp;

Personalmente trovo la notazione dot generalmente utile dal punto di vista non dover pensare di scrivere metodi setter corretti, che non è del tutto banale anche per setter nonatomic perché è necessario anche ricordarsi di rilasciare il vecchio valore corretto. L'uso del codice template aiuta ma puoi sempre commettere errori ed è generalmente un codice ripetitivo che ingombra le classi.

Un modello di essere a conoscenza di: se si definisce il setter da soli (invece di lasciare @synthesize crearlo) e iniziano ad avere altri effetti collaterali di impostazione di un valore probabilmente si dovrebbe fare il setter un normale metodo invece di chiamare utilizzando il notazione di proprietà.

semanticamente utilizzando le proprietà sembra essere l'accesso diretto al valore effettivo al chiamante e tutto ciò che varia da che dovrebbe quindi essere fatta tramite l'invio di un messaggio, non accesso a una proprietà (anche se sono in realtà entrambi i messaggi di invio).