Dopo aver letto un articolo umilmente intitolato "I comandamenti del codice: migliori pratiche per la codifica dell'obiettivo-C" di Robert McNally poco meno di due anni fa, ho adottato la pratica di utilizzare le proprietà per quasi tutti i membri dei dati delle mie classi di Objective-C ( il 3 ° comandamento a maggio 2012). McNally elenca questi motivi per farlo (la mia enfasi):
- Le proprietà applicano restrizioni di accesso (ad esempio di sola lettura)
- Le proprietà applicano i criteri di gestione della memoria (forte, debole)
- Le proprietà offrono l'opportunità di implementare in modo trasparente setter e getter personalizzati.
- Le proprietà con setter o getter personalizzati possono essere utilizzate per applicare una strategia di sicurezza del thread.
- Avere un solo modo per accedere alle variabili di istanza aumenta la leggibilità del codice.
Metto la maggior parte delle mie proprietà in categorie private, quindi i numeri 1 e 4 di solito non sono problemi in cui mi imbatto. Gli argomenti 3 e 5 sono più "morbidi" e con gli strumenti giusti e altre coerenze potrebbero diventare problemi. Quindi, infine, per me il più influente di questi argomenti è stato il numero 2, la gestione della memoria. Lo sto facendo da allora.
@property (nonatomic, strong) id object; // Properties became my friends.
Per i miei ultimi progetti sono passato all'utilizzo di ARC, il che mi ha fatto dubitare che la creazione di proprietà praticamente per qualsiasi cosa sia ancora una buona idea o forse un po 'superflua. ARC si occupa della memoria gestendo oggetti Objective-C per me, che per la maggior parte dei strong
membri funziona bene se si dichiarano semplicemente gli ivar. I tipi C che dovevi gestire manualmente comunque, prima e dopo ARC, e le weak
proprietà sono principalmente pubbliche.
Ovviamente uso ancora le proprietà per tutto ciò che richiede l'accesso dall'esterno della classe, ma queste sono per lo più solo una manciata di proprietà, mentre la maggior parte dei membri dei dati sono elencati come ivar sotto l'intestazione dell'implementazione
@implementation GTWeekViewController
{
UILongPressGestureRecognizer *_pressRecognizer;
GTPagingGestureRecognizer *_pagingRecognizer;
UITapGestureRecognizer *_tapRecognizer;
}
Come esperimento, l'ho fatto in modo un po 'più rigoroso e l'allontanamento dalle proprietà di tutto ha alcuni effetti collaterali positivi.
- Requisiti del codice membro dei dati (
@property
/@synthesize
) ridotti solo alla dichiarazione ivar. - La maggior parte dei miei
self.something
riferimenti è stata ripulita solo da_something
. - È facilmente distinguibile quali membri di dati sono privati (ivars) e quali sono pubblici (proprietà).
- Infine, sembra che questo sia lo scopo per cui Apple intendeva le proprietà, ma questa è una speculazione soggettiva.
Alla domanda : sto lentamente scivolando verso il lato oscuro, usando sempre meno proprietà a favore degli ivar di implementazione. Potete fornirmi un po 'di ragionamento sul perché dovrei attenermi all'uso delle proprietà per tutto, o confermare il mio attuale flusso di pensieri sul perché dovrei usare più ivar e meno proprietà solo dove necessario? La risposta più persuasiva per entrambe le parti riceverà il mio voto.
EDIT: McNally pesa su Twitter, dicendo : "Penso che il mio motivo principale per attenermi alle proprietà sia: un modo per fare tutto, che fa tutto (incluso KVC / KVO.)"