2009-06-26 7 views
11

Credo di capire le proprietà per la maggior parte. La mia domanda è, se ho una proprietà per una variabile di istanza, e sto impostandola o recuperandola da un metodo nel mio file di implementazione, dovrei usare self.myProperty o solo myProperty? So che entrambi funzionano, ma ho visto convenzioni miste, a volte il codice accede direttamente alla variabile e altre volte attraverso la proprietà.Devo utilizzare la parola chiave self (Proprietà) nell'implementazione?

Esiste un motivo tecnico per farlo? È solo convenzione/preferenza personale? E non mi riferisco alle istanze in cui il nome del parametro di un metodo si scontra con il nome della variabile di istanza, che potrebbe essere una ragione per usare la proprietà (Almeno, in altre lingue, non so di questo). Suppongo che quando si usa la proprietà entro l'attuazione, che vogliono sfruttare il modo in cui hanno dichiarato la proprietà (cioè nonatomic, mantenere), così per esempio in un metodo, si può fare:

self.myProperty = [someObject someAutoReleasedObject]; 

invece di:

myProperty = [[someObject someAutoReleasedObject] retain]; 

È questo il motivo? Quindi ci sono solo alcune situazioni in cui sarebbe bene usare la proprietà?

Sono nuovo di Objective-C, e questa è una delle poche cose che mi ha confuso. Finora ho appena avuto accesso alla variabile di istanza direttamente, con la più probabile falsa ipotesi che passare attraverso la proprietà in realtà inviti/mandi un metodo/messaggio e aggiunga un sovraccarico non necessario. Sono abbastanza sicuro di sbagliarmi, ma anche se la differenza di spese generali è trascurabile (se ce n'è una qualsiasi), perché si dovrebbe scegliere di aggiungerla quando si può semplicemente accedere direttamente alla variabile?

Sono quasi sicuro di sbagliarmi nel mio modo di pensare, motivo per cui sto chiedendo qui.

+0

non ho dati per convalidare questo, ma in base alla documentazione di Apple:. "Nei metodi che è possibile accedere direttamente alle variabili di istanze del vostro Classe Istanza Tuttavia, i metodi di accesso sono consigliati invece dell'accesso diretto, tranne nei casi in cui la prestazione è fondamentale. " Fare riferimento a: http://developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/ObjCTutorial/10AppendixA/10AppendixA.html –

+0

Ah ok, grazie. Sarebbe stato meglio come risposta. –

+0

Hai dimenticato di aggiungere che se stai eseguendo lo sviluppo di Cocoa che utilizza KVO o binding, è più consigliabile utilizzare "self" invece dell'accesso diretto perché il Key-Value Observing e il Cocoa Binding dipendono dai metodi di accesso che vengono chiamati per sincronizzare gli aggiornamenti/modifiche. –

risposta

5

In primo luogo, non è necessario utilizzare setter o getter in init o dealloc in base alla documentazione di Apple (e per buoni motivi).

Oltre a questo, in genere è necessario utilizzare il setter per impostare la variabile se ce n'è una.

Di solito non mi preoccupo di usare il getter per accedere a ivar dall'implementazione, ma ci sono momenti in cui è necessario. In particolare, se ci si aspetta che il getter possa eseguire un po 'di calibrazione o di controllo, o se si desidera consentire a sottoclassi di sovrascrivere il comportamento.

Certamente, l'utilizzo del getter nell'implementazione è più generale e più sicuro, ma è anche tipicamente inutile e dispendioso. Fate la vostra scelta.

Utilizzando il setter è importante in quanto dà un'opertunity per altro codice per osservare i cambiamenti (Key Value Observing), così come le sottoclassi la possibilità di eseguire l'override del setter e apportare eventuali altre modifiche necessarie.

Tuttavia, una cosa che consiglio vivamente è di usare un nome diverso per il tuo ivar e la tua proprietà. La normale convenzione è un prefisso di sottolineatura (_), sebbene io personalmente utilizzi lo i_ come prefisso per evitare qualsiasi confusione con l'utilizzo privato di Apple. In questo modo non è possibile utilizzare accidentalmente quella sbagliata:

self.name // use property 
i_name // use ivar 
self.i_name // syntax error 
name // syntax error 
+0

Grazie ancora Peter per aver risposto una delle mie domande Se nessun altro fornisce presto una spiegazione più approfondita, contrassegnerò la tua come risposta. A proposito, per creare alias per le proprietà come nell'esempio sopra, vorrei fare @synthesize name = i_name; destra? Inoltre, puoi indirizzare le mie supposizioni errate più probabili menzionate nel mio post originale per liberarmi della confusione? Grazie, lo apprezzo. –

+1

Sì, @synthesize name = i_name. –

0

Se stai esponendo la proprietà al mondo esterno e la stai utilizzando internamente, dovresti utilizzare la proprietà per tutto il codice. La ragione è l'incapsulamento. Supponi di avere una proprietà "Id" per SomeObj. Dì ad un certo punto decidi di sostituire il modo in cui Id si comporta (forse hai iniziato con Id come membro della classe, e attraverso l'evoluzione diventa un pezzo di dati che viene recuperato dal database). Ora devi passare attraverso l'implementazione della classe e sostituire tutti i riferimenti al membro var con le chiamate al database. Se tu avessi il tuo ego, dovresti solo scavalcare il getter.