2012-05-04 14 views
7

Utilizzo l'oggetto Delega app in diverse classi. Voglio accedervi in ​​tutto il progetto. Sto definire questo oggetto nel file Prefix.pch comeL'utilizzo di #define per accedere all'oggetto Delega dell'app non funziona

#define Appdelegate (AppDelegate *)[[UIApplication sharedApplication] delegate] 

ma problema è che variabile AppDelegate non acceda variabile delegato App. mostra errore.

ma se l'uso del mattino questo codice funziona bene

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
appDelegate.variablename; 

sto facendo corretto o c'è un modo di fare quello che faccio?

grazie in anticipo.

risposta

15

dovrebbe essere:

#define Appdelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate]) 
//     ^----------------------parenthesis--------------------------^ 
+5

Sì. Con il tuo '# define', facendo' [Appdelegate variablename] 'funzionerebbe, ma non' Appdelegate.variablename'. Perché se ometti la parentesi esterna, il cast in '(AppDelegate *)' verrebbe eseguito sull'intera espressione, in questo caso il tuo 'variablename'. – Cyrille

+1

grazie Sharet, sta funzionando bene ora. – Bond

1

Come questa domanda e le sue risposte dimostrano, appoggiato al preprocessore di solito è una cattiva idea.

  1. È facile sbagliare. Tutti sviluppiamo buoni istinti per la precedenza degli operatori, ma il preprocessore non ha idea. Per difendersi da problemi di contesto inaspettati, spesso è necessario avvolgere tutto in extra parentesi e parentesi graffe.

  2. È facile convincersi che stai facendo una cosa quando il codice ne sta facendo un altro. Quando le cose si rompono, né i messaggi di errore del compilatore né il debugger sono in grado di aiutare molto.

  3. Più importante, il preprocessore può farti prendere una cattiva idea e diffonderlo in modo pervasivo attraverso il programma. La cattiva idea qui sta usando il Delegato app in tutto il mondo.

Le variabili globali sono un odore di codice. Gli sforzi per rendere le variabili globali ancora più globali inserendole in intestazioni precompilate sono un odore di codice. Se il framework pensava che dovessi avere accesso a AppDelegate da ovunque, non avresti bisogno di saltare attraverso questi (modesti) cerchi!

Quindi, quando si è tentati di fare qualcosa di simile, è bello sapere che il preprocessore è lì e le intestazioni pch ci sono, ma tieni presente che stai combattendo il framework e quasi certamente facendo un errore di progettazione. Potrebbe essere OK nel tuo contesto, ma è qualcosa da sapere.

2

è necessario importare il file AppDelegate dove siete dichiarare delegato macro:

importazione "AppDelegate.h"

e quindi definire

definire AppDelegate (((AppDelegate *) [[UIApplication sharedApplication ] delegate]))