2012-05-04 7 views
7

Używam obiektu Delegat aplikacji w różnych klasach. Chcę uzyskać do niego dostęp w całym projekcie. Zdefiniuj ten obiekt w pliku Prefix.pch jakoUżywanie #define do dostępu do elementu Delegat aplikacji Obiekt nie działa

ale problem polega na tym, że zmienna Appdelegate nie ma dostępu do zmiennej delegowanej aplikacji. it Pokazuje błąd.

ale jeśli am wykorzystanie ten kod działa poprawnie

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

robię to poprawne, czy jest jakiś sposób na to, co robię?

dzięki z góry.

Odpowiedz

15

Powinno być:

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

Yup. Z twoim '# define', działałoby' [Appdelegate variablename] ', ale nie' Appdelegate.varianazwa_pliku'. Ponieważ jeśli pominąć zewnętrzny nawias, rzutowanie na '(AppDelegate *)' zostanie wykonane na całym wyrażeniu, w tym przypadku na twoim 'variablename'. – Cyrille

+1

dzięki Sharet, teraz działa dobrze. – Bond

1

Jak to pytanie i odpowiedziach wykazać, opierając się na preprocesora jest zazwyczaj zły pomysł.

  1. Łatwo się pomylić. Wszyscy wypracowujemy dobre instynkty dla operatorów, ale preprocesor nie ma pojęcia. Aby bronić się przed nieoczekiwanymi problemami z kontekstem, często trzeba zawijać wszystko w dodatkowe pareny i nawiasy klamrowe.

  2. Łatwo jest się przekonać, że robisz jedną rzecz, gdy kod wykonuje drugą. Kiedy wszystko się psuje, komunikaty o błędach kompilatora i debuggera prawdopodobnie nie pomogą.

  3. Co najważniejsze, preprocesor może pozwolić sobie na zły pomysł i rozpowszechniać go w całym programie. Zły pomysł polega na tym, że używasz Delegata aplikacji na całym świecie.

Zmienne globalne to zapach kodu. Wysiłki mające na celu uczynienie globalnych zmiennych jeszcze bardziej globalnymi poprzez wrzucenie ich do prekompilowanych nagłówków to zapach kodu. Jeśli ramy uważały, że powinieneś mieć dostęp do AppDelegate zewsząd, nie musiałbyś przeskakiwać przez te (skromne) obręcze!

Tak więc, kiedy mamy ochotę zrobić coś takiego, dobrze jest wiedzieć, że preprocesor istnieje, a nagłówki pch tam są, ale pamiętaj, że walczysz z frameworkiem i prawie na pewno popełniasz błąd projektowy. To może być w porządku w twoim kontekście, ale warto o tym wiedzieć.

2

należy zaimportować plik AppDelegate gdzie jesteś oświadczam delegata makro:

import "AppDelegate.h"

a następnie zdefiniować

zdefiniowania Appdelegate (((AppDelegate *) [[UIApplication sharedApplication ] delegate]))

Powiązane problemy