2012-04-05 3 views
6

Ho una proprietà che non sintetizzo, invece creo me stesso un getter e setter. Pertanto, le parole chiave ARC (forti o deboli) non hanno alcun significato, presumo, quindi li elimini. Funziona perfettamente con Xcode 4.3, ma quando il mio collega li apre su XCode 4.2 il compilatore si lamenta che non esiste una parola chiave strong/weak, quindi gli ho chiesto di inserire di nuovo la parola chiave senza senso. Qual è il corretto (con o senza parole chiave)?Ho bisogno di parole chiave ARC per proprietà che non sintetizzo?

Per essere chiari: ho una proprietà come questa @property (nonatomic) NSString *foo e nel file .m implemento -(NSString *)foo e -(void)setFoo:(NSString *)foo e non comprendono @synthesize foo. Un altro dettaglio rilevante è che non esiste un iVar corrispondente, invece le proprietà interagiscono con un oggetto Core Data. Questo non verrà compilato in XCode 4.2 a meno che non aggiungo forte o debole alle parole chiave.

EDIT ho pensato a una cosa più rilevante, una di queste proprietà è in un protocollo, non so se questo fa la differenza.

risposta

1

L'dichiarato attributi che si fa riferimento sono opzionali. Per citare la documentazione:

dichiarazione di proprietà e implementazione
La direttiva @property dichiara una proprietà. Un insieme di attributi opzionale con parentesi fornisce ulteriori dettagli sulla semantica di storage e altri comportamenti della proprietà - consultare "Attributi della dichiarazione di proprietà" per i possibili valori.

dichiarazione di proprietà Attributi
si può decorare una proprietà con attributi utilizzando il modulo @property(attribute [, attribute2, ...]). Analogamente ai metodi, le proprietà sono associate alla loro dichiarazione di interfaccia . Per le dichiarazioni di proprietà che utilizzano un elenco delimitato da virgole di nomi di variabili, gli attributi di proprietà si applicano a tutte le proprietà denominate .

Se si utilizza la direttiva @synthesize per dire al compilatore per creare i metodi di accesso (vedere “Direttive di attuazione Proprietà”), il codice che genera corrisponda alle specifiche data dalle parole chiave. Se implementa autonomamente i metodi di accesso, è necessario assicurarsi che sia corrispondente alla specifica (ad esempio, se si specifica la copia è necessario assicurarsi di copiare il valore di input nel metodo setter).

Se quindi si utilizza @dynamic invece di @synthesize si sta dicendo al compilatore che verrà scrivendo i propri metodi e gli impedisce di lamentarsi quando non trova metodi adeguati.

Maggiori informazioni possono essere trovate here.

+0

Interessante ... Proverò ad aggiungere una dinamica e vedere se funziona su XCode 4.2 – borrrden

+1

+1, risposta molto chiara – jmstone617

0

borrrden,

In primo luogo, perché si cura di elidere la vostra politica di memoria nella sua dichiarazione di proprietà? Annuncia ai consumatori della tua classe qual è la politica. Non vuoi che lo sappiano?

In secondo luogo, @synthesize non è un nop. È il meccanismo con cui il linguaggio supporta KVO. Anche se forse non lo stai usando ora, perché dovresti precludere questo uso per il futuro.

Francamente, non usando una descrizione completa in @property né usando @synthesize, sei IMO, impegnandoti in un'ottica prematura. Il tuo attuale design non ti salva messaggi inviati e ti costringe a gestire, se necessario, la creazione e la digitazione di ivars. E stai perdendo le caratteristiche della lingua.

A meno che non si abbia una buona ragione per uscire dai limiti dei modelli preferiti di Obj-C v2 +, e non li si è elencati, tornerei ad usare lo schema standard. Quindi il tuo problema va via.

Andrew

+0

Ci sono spesso buone ragioni per scrivere i propri metodi. (Come proprietà calcolate, convalida, ecc.) – lnafziger

+0

'@ synthesize' non ha nulla a che fare con KVO. Puoi usare KVO senza mai scrivere '@ synthesize 'e fornendo al contempo personalizzatori e getter personalizzati. –

+0

Non si tratta di ottimizzazione, si tratta di logica. Non ci sono iVar per queste proprietà Le proprietà interagiscono con gli oggetti Core Data impostando a loro volta le loro proprietà. In questo caso le consideri forti o deboli? Forse lo stesso della successiva proprietà dell'oggetto che sto impostando. Non mi dispiace scriverli finché non causerò alcun effetto collaterale. – borrrden