Domanda

Credo di comprendere le proprietà per la maggior parte. La mia domanda è, se ho una proprietà per una variabile di istanza e la sto impostando o recuperando da un metodo nel mio file di implementazione, dovrei usare self.myProperty o solo myProperty? So che uno dei due funziona, ma ho visto convenzioni miste, a volte il codice accede direttamente alla variabile e altre volte attraverso la proprietà.

C'è un motivo tecnico per farlo? È solo una 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 dell'istanza, che potrebbe essere un motivo per utilizzare la proprietà ( Almeno, in altre lingue, non lo so uno ). Suppongo che quando si utilizza la proprietà all'interno dell'implementazione, vogliono trarre vantaggio dal modo in cui hanno dichiarato la proprietà ( cioè non anatomico, conservare ), quindi ad esempio in un metodo, si può fare :

self.myProperty = [someObject someAutoReleasedObject];

anziché:

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 acceduto direttamente alla variabile di istanza, con il più probabile falso presupposto che passare attraverso la proprietà in realtà chiama / invia un metodo / messaggio e aggiunge un sovraccarico non necessario. Sono abbastanza sicuro di sbagliarmi, ma anche se la differenza nell'overhead è trascurabile (se ce n'è anche uno), perché si dovrebbe scegliere di aggiungerlo quando si può semplicemente accedere direttamente alla variabile?

Sono abbastanza sicuro di aver sbagliato nel mio pensiero, motivo per cui sto chiedendo qui.

È stato utile?

Soluzione

In primo luogo, non dovresti usare setter o getter in init o dealloc secondo la documentazione di Apple (e per buoni motivi).

A parte questo, dovresti generalmente usare il setter per impostare la variabile se ce n'è una.

Di solito non mi preoccupo di usare il getter per accedere a Ivar dall'interno dell'implementazione, ma ci sono momenti in cui è necessario. In particolare, se ti aspetti che il getter possa eseguire alcune operazioni di verifica o verifica o se desideri consentire alle sottoclassi di ignorare il comportamento.

Certamente, usare il getter nell'implementazione è più generale e più sicuro, ma è anche tipicamente inutile e dispendioso. Fai la tua scelta.

L'uso del setter è importante in quanto consente a un altro codice di osservare le modifiche (Key Value Observing), nonché delle sottoclassi la possibilità di sovrascrivere il setter e apportare qualsiasi altra modifica richiesta.

Comunque una cosa che consiglio vivamente è usare un nome diverso per il tuo ivar e la tua proprietà. La normale convenzione è un prefisso di sottolineatura (_), sebbene io personalmente usi i_ come prefisso per evitare qualsiasi confusione con l'uso privato di Apple. In questo modo non puoi usare accidentalmente quello sbagliato:

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

Altri suggerimenti

Se stai esponendo la proprietà al mondo esterno e la stai utilizzando internamente, dovresti utilizzare la proprietà in tutto il codice. Il motivo è l'incapsulamento. Supponi di avere un & Quot; Id & Quot; proprietà per SomeObj. Supponi che a un certo punto decidi di sostituire il comportamento di Id (forse hai iniziato con Id come membro var 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 avessi te stesso, dovresti semplicemente scavalcare il getter.

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