2012-12-24 14 views
6

nel sistema operativo di Apple X 10.8 Nucleo Documentation Library sotto Programmazione con Objective-C, si afferma,Custodia per non usare proprietà in Objective-C

"E 'buona norma utilizzare una proprietà su un oggetto qualsiasi momento è necessario tenere traccia di un valore o di un altro oggetto.Se è necessario definire le proprie variabili di istanza senza dichiarare una proprietà, è possibile aggiungere all'interno di parentesi graffe nella parte superiore dell'interfaccia di classe o implementazione ... "

Quindi Sono curioso, quindi, quali saranno i casi in cui è necessario definire le variabili di istanza senza dichiarare le proprietà? A parte quello che dice Apple, potrebbe davvero essere solo una cosa di preferenza personale?

Grazie!

risposta

2

Alcuni di essi sono sicuramente una questione di preferenza, ma non tutto: si sta meglio con una proprietà per gli articoli con visibilità esterna e gli elementi che richiedono un controllo di accesso diverso all'interno o al di fuori della classe. Il problema è stato molto meno pronunciato dall'introduzione di ARC, perché prima si potrebbe voler utilizzare le proprietà per le chiamate automatizzate di retain e release. Il significato di questo aspetto delle proprietà è stato ridotto notevolmente a situazioni in cui è necessario copiare automaticamente gli oggetti nella proprietà.

0

Preferisco le proprietà perché sono in grado di definire setter/getter e perché mi piace più quella sintassi.
Molte persone affermano che è una cattiva pratica di utilizzare Ivars, come in questo articolo:
http://cocoasamurai.blogspot.it/2012/08/cover-up-those-ivars.html
Purtroppo al giorno d'oggi i programmatori chiamano cattiva pratica tutto ciò che non piace, anche in assenza di ragioni obiettive.
Se dichiari un ivar puoi ancora usare la direttiva @private, quindi non è questione di esporre o meno variabili. Penso che se ti piacciono più ivari dovresti usarli.

1

Se si utilizza ARC e un runtime recente (abbastanza recente da consentire di dichiarare i propri ivars nel proprio blocco @implementation), le variabili di istanza sono improvvisamente di nuovo impressionanti. Perché? Perché a differenza di @properties sono specifici della classe. Nessun rischio verranno accidentalmente sovrascritti da una sottoclasse.

Sono anche più veloci nel caso semplice, dal momento che non si chiamano metodi per ottenerli o impostarli.

Personalmente trovo anche molto più pulito. Non ci sono più estensioni di classe che definiscono private @properties e tutta quella spazzatura. Solo ivar, bello e semplice.

Quindi il miglior consiglio, IMHO, è di usarli per impostazione predefinita. Utilizza @properties solo se hai effettivamente bisogno della loro funzionalità, ad esempio

  • Hai bisogno di un modo per accedervi dall'esterno della classe.
  • Si desidera consentire alle sottoclassi di sovrascriverle.
  • Il getter o setter è più di un compito banale.

Questi ultimi due sono tutti in realtà più rari di quanto si possa pensare. In genere non è saggio provare a sovrascrivere le proprietà nelle sottoclassi, solo perché è un po 'insolito e ci sono alcuni spigoli.

Se in seguito si scopre che è necessario aggiornare un ivar a @property, è semplice e intuitivo: l'unico posto a cui è possibile accedere si trova nella tua @implementation, quindi in genere è semplice ricerca-e- sostituire per aggiungere "self". ai suoi riferimenti (e forse rimuovi il trattino basso principale, se li chiami in quel modo). Fino a quel momento non è necessario pagare i costi e correre il rischio di usare @properties.

Problemi correlati