@property @synthesize

Cosa fanno @synthesize e @property in Xcode? Si prega di fornire una spiegazione in termini davvero semplici?

Hai chiesto dei termini semplici:

@property dichiara una proprietà nell’intestazione della class

 @property (nonatomic, retain) NSString *myString; 

@synthesize crea il tuo setter e getter per la tua proprietà (metodi di accesso)

Senza sintetizzare devi scrivere il tuo setter e l’implementazione getter, come getMyString o setMyString (capitalizza il primo carattere della tua proprietà)

Sam: Solo un consiglio: http://www.cocoadevcentral.com/d/learn_objectivec/ è una risorsa piuttosto solida per conoscere nozioni di base come proprietà.

In bocca al lupo!

Proprietà e accessi sintetizzati sono nuove funzionalità in Objective-C 2.0.

Quando dichiari @property dichiari in qualche modo un’istanza var. Quindi tu @synthesize metodi di accesso (es. Getter e setter) per quella proprietà.

Ci sono anche @dynamic se sei interessato.

Dovresti davvero fare i compiti su questo. Apple ha nifty pdf per questo.

Pensa a tutta la magia dell’objective come una “macro più intelligente”, come una “più intelligente istruzione #define” @property se si nota che è sempre nel file h, @synthesize è sempre nel file m. Quindi in background @property (qualunque sia) NSString * myString;

diventa una dichiarazione di 2 metodi e una variabile privata;

 void set_myString:(NSString *) str; (NSString*) get_myString; 

dichiarazioni nel file di intestazione

per far sì che facciano qualcosa, la loro implementazione viene aggiunta al file m quando si digita @synthesize myString; che diventa qualcosa come void set_myString: (NSString *) str {myString = str; }

 (NSString *) get_myString { return (myString); } 

Ma è più intelligente di questo a seconda che tu dica “retain” “strong” o “weak”, o restituirà semplicemente il puntatore a myString o copierà myString in un nuovo object

Quindi tutto questo viene fatto automaticamente da un compilatore semplicemente leggendo le tue dichiarazioni. Il che è abbastanza utile e consente di risparmiare un sacco di tempo

Di default tutte le nostre variabili sono private quindi non possiamo accedere alla class. se vogliamo usare la nostra variabile di istanza fuori dalla class. Quando dichiari @property dichiari in qualche modo un’istanza var. Quindi tu @synthesize metodi di accesso (es. Getter e setter) per quella proprietà.

Ci sono anche @dynamic se sei interessato.

imposta semplicemente il nome della variabile setter della proprietà nella propria class. Ad esempio, diciamo che ho questo: @property (nonatomic, copy) NSArray* viewControllers;

Bene, se voglio accedere al settatore _viewController non impostarei una variabile sintetizzata. ma se voglio accedere alla variabile viewController con il nome viewController invece di _viewController , vorrei fare @synthesize viewController; .

Se volessi usarlo come nome completamente diverso, potrei farlo @synthesize viewControllers = viewControlololer; ma questo è solo setter. Come noterai [self viewControllers] funziona solo e non [self viewControlololer];

Quindi non capisco perché tutti scrivano “setter e getter” di una proprietà. Non cambia affatto la variabile getter … a meno che ciò non significhi [self viewController] conoscenza di viewControlololer (ovviamente).

In realtà le proprietà sono sintetizzate, implicitamente o esplicitamente. Le proprietà sono implicitamente sintetizzate. Quindi non c’è bisogno di usare sintetizzati a meno che non vogliate cambiare il nome della variabile in qualcosa di diverso da _property_name.

Esistono altri casi d’uso, ad esempio se non si desidera che una variabile di istanza supporti la proprietà.

Le proprietà sono sintetizzate in modo esplicito usando la direttiva @synthesized.

(Risposta estratta dalla guida di Big Nerd Ranch)