2012-02-20 11 views
28

In quali condizioni @synthesize automatico in Objective-c?In quali condizioni @synthesize è automatico in Objective-c?

Forse quando si utilizza LLVM 3.0 e versioni successive? Dalla lettura in rete sembra che @synthesize non sia necessario a partire da Xcode 4. Tuttavia sto usando Xcode 4 e ricevo avvisi quando non ho una proprietà @synthesize.

Alcune delle risposte a Why don't properties get automatically synthesized sembrano implicare @synthesize può essere omesso ad un certo punto in alcune circostanze.

suggerendo che @synthesize potrebbe essere automatico in qualche punto nel futuro.

+5

Avete un collegamento per cui @synthesize è descritto come non necessario? – bneely

+0

Forse ha visto alcune informazioni sulla XDA 4.4 attualmente sotto la NDA e si è confuso sui numeri di versione. –

+1

@bneely ha aggiunto un collegamento. Forse sto fraintendendo "@synthesize è automatico nelle ultime versioni del compilatore LLVM 2.0". – SundayMonday

risposta

11

A partire da Xcode 4.4, se non si scrive @synthesize o @dynamic per una proprietà. il compilatore funziona come se avessi scritto @synthesize property = _property.

Prima di Xcode 4.4, è necessario eseguire una delle seguenti operazioni per ogni proprietà oppure il compilatore emetterà un avviso e si otterrà un errore di runtime. In Xcode 4.4 o versioni successive, è possibile eseguire una delle seguenti operazioni anziché consentire al compilatore di sintetizzare automaticamente gli accessors della proprietà e la variabile di istanza.

  1. Utilizzare la direttiva @synthesize.
  2. Utilizzare la direttiva @dynamic e in qualche modo fornire la proprietà getter e (se necessario) setter in fase di esecuzione.
  3. Scrive esplicitamente il metodo getter della proprietà e, se la proprietà è readwrite, il metodo del setter della proprietà.

Si noti che è possibile utilizzare la direttiva @synthesize (o la direttiva @dynamic) e anche forniscono esplicitamente i metodi getter e/o setter. Ma @synthesize fornisce loro se li ometti.

+2

Se fornisci ENTRAMBI il getter e il setter, allora perdi l'ivar automatico, giusto? –

23

A partire da clang 3.2 (circa febbraio 2012), "default synthesis" (o "sintesi proprietà auto") delle proprietà Objective-C viene fornita per impostazione predefinita. È essenzialmente come descritto nel post del blog che hai letto in origine: http://www.mcubedsw.com/blog/index.php/site/comments/new_objective-c_features/ (eccetto che quel post descrive la funzionalità come "abilitata, quindi disabilitata"; non so se questo è un problema con Xcode o se gli sviluppatori clang stessi sono tornati indietro e avanti sulla domanda).

Per quanto ne so, l'unico caso in cui le proprietà saranno non di default sintetizzate in clang 3.2 è quando quelle proprietà sono state ereditate da un protocollo. Ecco un esempio:

#import <Foundation/Foundation.h> 

@protocol P 
@property int finicky; 
@end 

@interface A : NSObject <P> 
@property int easygoing; 
@end 

@implementation A 
@end 

int main() { A *a = [A new]; a.easygoing = 0; a.finicky = 1; } 

Se compilate questo esempio, si otterrà un avvertimento:

test.m:11:17: warning: auto property synthesis will not synthesize property 
     declared in a protocol [-Wobjc-protocol-property-synthesis] 
@implementation A 
       ^
test.m:4:15: note: property declared here 
@property int finicky; 
      ^
1 warning generated. 

e se lo si esegue, si otterrà un errore dal runtime:

objc[45820]: A: Does not recognize selector forward:: (while forwarding setFinicky:) 
Illegal instruction: 4 
4

È possibile disattivare gli avvisi di sintetizzazione facendo clic sul nome del progetto nel Navigatore di progetto a sinistra, quindi fare clic su All Cobined in Build Settings e quindi cercare sintetizzare. Questo dovrebbe essere impostato su No.

+0

In realtà questa è l'unica risposta corretta, una vecchia risposta. Il resto va in profondità. Assicurati di controllare le impostazioni di tutti i tuoi obiettivi, se hai più – doozMen

12

Dal documento New Features in Xcode 4.4:

@properties Objective-C sono sintetizzati per impostazione predefinita quando non esplicitamente attuata.

Quindi @synthesize è automatico di default a partire da Xcode 4.4 con il compilatore LLVM 4.0.

+3

Nota che la sintesi automatica non è supportata per Mac OS X a 32 bit. – ThomasW

7

Inoltre, sintetizzare non sarà automatico se è stato implementato manualmente il setter AND getter. Quindi, se ti chiedi perché non puoi accedere a _someVariable, avendo dichiarato @property (...) SomeType someVariable, allora è perché hai implementato il setSomeVariable: e alcuni metodi Variable.

Problemi correlati