2011-09-21 11 views
8

Per quanto ho capito @property dichiara getter e setter nel file .h e @synthesize implementa getter e setter nei file .m. Inoltre è possibile scrivere la propria implementazione per getter e setter invece di usare @synthesize.Objective-C: dichiarazione @property senza implementazione (@synthesize)

Quindi, se abbiamo sempre bisogno di implementare il setter/getter, perché dobbiamo dichiararlo addizionale? @property sembra essere semanticalmente ridondante per me e una fonte di bug.

Cosa succede quando dichiaro una @property ma dimentico di implementarla con @synthesize o manualmente? Che cosa succede quando uso @synthesize e dimentico la dichiarazione @property?

risposta

26

Le proprietà sono ora sintetizzate di default, poiché Xcode 4.4, quindi sì, hai ragione, era ridondante e Apple ha rimosso la necessità di scrivere sia @property che @synthesize, basta usare @property da ora in poi.

+0

bello che hanno aggiunto questo. Grazie per la risposta –

+8

C'è ancora un caso in cui sarà necessario utilizzare entrambe le proprietà e sintetizzare insieme. Il compilatore utilizzerà il nome della proprietà più il prefisso underscore per creare l'ivar. Se il _propertyname di ivar si scontra con una variabile di istanza privata, sarà necessario sintetizzarlo su un nuovo ivar. Ad esempio: se si sottoclasse la UIToolbar e si dichiara che una proprietà la nomina come delegata, si otterrà un errore nel tentativo di utilizzare ivar _delegate perché la UIToolbar contiene una variabile di istanza privata id _delegate. Puoi risolvere questo problema usando '@synthesize delegate = _mydelegate;'. – lolol

4

Cosa succede quando dichiaro una @property ma dimentico di implementarlo con @synthesize o manualmente? Che cosa succede quando uso @synthesize e dimentica la dichiarazione @property?

Perché non ci provi? Se ti dimentichi di sintetizzare gli accessor o fornirne uno tuo, il compilatore ti avviserà. (E se lo hai impostato per trattare gli avvertimenti come errori, che è una buona idea, è impossibile perdere l'avviso.) Il secondo caso di solito porta ad un errore di compilazione.

Quindi, se è sempre necessario implementare il setter/getter, perché è necessario specificare ? @property sembra essere semanticamente ridondante a me e una fonte di bug.

Per dirla semplicemente, @property è una dichiarazione di proprietà e @synthesize è una possibile implementazione. Uno appartiene all'intestazione (= descrizione dell'interfaccia pubblica), l'altro al file di implementazione. Come lo faresti se non in questo modo?

6

avendo seguito in .h file di

@property (retain, nonatomic) NSString* userName; 

è zucchero sintattico per

-(NSString*)userName; 

-(void)setUserName:(NSString*)userName; 

nel file .h

e @synthesize in .m è zucchero sintattico per lasciare per il proprio implementazione rispettando il tuo retain, nonatomic, ecc. come specificato nella dichiarazione di proprietà.

non è possibile sintetizzare con @property, anche se è stato specificato getter adatto, firma setter nel file .h.

Ma puoi lasciare @synthesize e implementare il tuo getter e setter.

Se hai fatto entrambe @synthesize e anche il tuo setter getter personalizzato, il tempo di esecuzione rispetta la tua implementazione e chiama lo stesso.

+0

bella spiegazione – onmyway133

2

Volevo solo aggiungere che è possibile utilizzare anche @dynamic invece di @synthesize, sebbene questo sia molto raramente qualcosa che devi fare. @dynamic sta fondamentalmente dicendo al compilatore che sei in qualche modo andando ad assicurarsi che le chiamate ai getter e setter saranno prese in considerazione in fase di esecuzione, o facendole da te o facendo qualche giro in più con alcuni di le caratteristiche speciali del runtime Objective C.

+0

Mi interessa che "in qualche modo". Volevo appoggiare alcune proprietà di stile dei punti con un dizionario e fallito completamente. Probabilmente frutta per una domanda. –

Problemi correlati