Domanda

Ho un'applicazione che sto scrivendo che utilizza esclusivamente @properties.Non ho dichiarato alcun ivar in nessuno dei miei file di classe.A quanto ho capito, le ivar non sono più necessarie con l'introduzione di @property.Sto codificando secondo le migliori pratiche?Questo finirà per mordermi il proverbiale sedere a lungo termine?Ho letto pareri contrastanti su cosa sia "giusto" e cosa "sbagliato"...

È stato utile?

Soluzione

In genere non dichiaro nemmeno gli ivar. Lo userò spesso @synthesize foo = foo_; tuttavia per impedire l'accesso diretto quando intendevo il metodo diretto o viceversa. E lascio sempre che il compilatore sintetizzi automaticamente ivar con il file _ prefisso (che impedisce l'accesso diretto accidentale, come previsto dal colpito frase).

E, come ha detto Caleb, ci sono ancora ivar in giro, semplicemente non li dichiari esplicitamente a meno che tu non lo voglia davvero (cosa che, in realtà, non lo fai poiché gli ivar esposti nelle intestazioni non sono utili ai client della classe , se l'API è progettata in modo appropriato).

Trovo anche che l'hype su "usa solo l'accesso diretto in init/dealloc, usa setter/getter ovunque" sia in gran parte esagerato e, quindi, usa semplicemente setter/getter ovunque.La realtà è che se hai degli osservatori durante l'inizializzazione/deallocazione, sei già in difficoltà;lo stato dell'oggetto è, per definizione, indefinito durante la costruzione/distruzione e, quindi, un osservatore non può ragionare correttamente sullo stato.


Come sottolinea Caleb, un altro motivo per utilizzare l'accesso diretto a ivar in init/dealloc è evitare sottoclassi che implementano una logica setter/getter personalizzata che potrebbe fallire a causa dello stato indefinito dell'oggetto durante init/dealloc.

Anche se questo può essere vero, considero un brutto difetto architetturale implementare setter/getter con un comportamento personalizzato.Farlo è fragile e rende molto più difficile il refactoring del codice nel tempo.Inoltre, tale comportamento personalizzato avrà spesso dipendenza da altri stati all'interno dell'oggetto e tale dipendenza porta quindi a dipendenze di ordine sui cambiamenti di stato che non sono affatto riflessi dall'apparentemente semplice @property dichiarazione.

Cioè.se i tuoi setter e getter sono scritti in questo modo foo.bar = bad; non può essere eseguito a Qualunque tempo acceso foo, il tuo codice è corrotto.

Altri suggerimenti

Non è così tanto che le variabili di istanza non sono necessarie.È solo quella variabile di istanza dichiarazioni non sono necessarie.Dato una proprietà e un'istruzione @synthesize, il compilatore si prenderà cura di creare la variabile di istanza insieme ai metodi di accessori appropriati.

Non c'è niente di sbagliato nell'uso delle proprietà esclusivamente.Semplifica la gestione della memoria.Non c'è anche niente di sbagliato nell'uso di Ivars senza proprietà, se è quello che vuoi.Se si desidera utilizzare le proprietà, ma non vuoi pubblicizzare gli accessori al resto del mondo (cioè mantenere l'incapsulamento), considerare dichiarare le tue proprietà non pubbliche in un'estensione di classe (fondamentalmente una categoria anonima nel tuo file di implementazione). .

L'uso di Ivars certamente non è sbagliato, tuttavia le migliori pratiche ora vengono invece spingere per l'uso @property.

Un luogo in cui è possibile utilizzare un Ivar è quando si desidera dichiarare una proprietà protetta.Dichiari la proprietà nel file .m per una classe e dichiara il suo corrispondente IVAR nel .h con la direttiva @protected.Questo ti permetterà di avere un accesso protetto nella sottoclasse.Non c'è alternativa per l'accesso protetto ai membri.

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