Non c'è risposta tagliata e secca. Tuttavia, ricorda che l'ottimizzazione prematura è cattiva. In Cocoa on the Mac o su iPhone, l'uso di accessors/properties deve essere conforme a KVO. La conformità KVO è necessaria affinché Core Data e Cocoa Bindings funzionino automaticamente. In Core Data, non è solo necessario garantire KVO quando si modificano le proprietà, ma anche quando si accede a loro.
È inoltre consigliabile utilizzare accessors/properties quando si desidera garantire il comportamento di gestione della memoria delle proprietà, vale a dire, sempre quando si imposta un ivar per utilizzare il setter o la notazione dei punti e in base al modello di gestione della memoria che si segue , per usare sempre accessorie/proprietà quando si ottiene un ivar.
Esistono diversi modelli di gestione della memoria. Tutti quelli non interrotti assicurano che un oggetto restituito da un accessore sopravviverà almeno alla fine del campo di autorelease corrente. Significa che l'oggetto viene esplicitamente trattenuto e autorizzato automaticamente nell'ambito di autorelease corrente. Il metodo raccomandato da Apple lo fa esplicitamente nella getter:
- (id)foo {return [[foo retain] autorelease]; }
- (void)setFoo:(id)aFoo {
if(! [aFoo isEqual:foo]) {
[foo release];
foo = [aFoo retain];
}
}
E 'implicito che è il modello seguono nelle loro funzioni di accesso sintetizzati. Personalmente, preferisco autorelease nel setter:
- (id)foo {return foo;}
- (void)setFoo:(id)aFoo {
[foo autorelease];
foo = [aFoo retain];
}
Questa autoreleasees il valore precedente prima di sostituirla con il nuovo valore. Ciò ha esattamente lo stesso effetto di mantenere e autoreleasing nel getter, ma richiede che l'oggetto venga aggiunto a un pool di autorelease solo una volta. La maggior parte delle volte ha un conteggio di ritenzione di uno e non è autorizzata, quindi non andrà da nessuna parte, non importa cosa succede. Se la proprietà viene sostituita durante un codice che è ancora in attesa (ad esempio in un callback delegato), non scomparirà da esso.
Ciò significa che l'utilizzo di accessor/proprietà ti darà la certezza che i tuoi oggetti saranno intorno a quando ne avrai bisogno senza che qualche altra parte del codice li rilasci da sotto di te.
L'ultimo e migliore motivo per utilizzare sempre accessor/proprietà è che fa un minor numero di presupposti per ogni proprietà: che esiste un ivar sottostante per quella proprietà, e che ha lo stesso nome (immagino siano due ipotesi) . Forse in futuro vorrai sostituire un ivar con un accessorio derivato. La notazione della proprietà continuerà a funzionare. Forse vuoi rinominare l'ivar; la proprietà continuerà a funzionare. Fortunatamente, si può fare affidamento sul refactoring in Xcode, ma perché preoccuparsi?
Il punto di programmazione orientata agli oggetti è utilizzare le interfacce definite sulla classe. Non c'è una buona ragione (sebbene ci siano molti pregiudizi e razionalizzazioni) che una classe ignori la propria interfaccia. Ogni metodo, ad eccezione degli stessi accessors, dovrebbe, nel caso generale, considerare l'oggetto come sacrosanto e il suo stato interno come privato. Scrivi ogni metodo come se fosse in una categoria o in una sottoclasse e tratti Ivars come stato privato, a meno che le specifiche esigenze di progettazione non siano dirette diversamente. Ci sono molti buoni motivi per accedere direttamente a ivars, ma sono determinati caso per caso.
Ho trovato un post simile qui: http://stackoverflow.com/questions/1051543/should-i-use-self-keyword-properties-in-the-implementation – Jonah