2010-10-19 13 views
6

W moim pliku .m dla klasy o nazwie Ad mam 3 statyczne ciągiCel C - zmienna statyczna i globalna?

static NSString *AdStateDisabled = @"disable"; 
static NSString *AdStateExpired = @"expired"; 
static NSString *AdStateActive = @"active"; 

mogę po prostu korzystać z tych zmiennych statycznych w bieżącej klasy, ale nie mogę do nich zadzwonić z innej grupy, czy istnieje sposób na globalne wprowadzanie tych zmiennych statycznych? Więc na przykład w mojej klasie viewcontroller mogę zrobić coś takiego.

//HomeViewController.m 
if ([self.ad.state isEqual:Ad.AdStateDisabled]) 
{ 
    //do something 
} 

Odpowiedz

16

Możesz dodać następujące deklaracje do nagłówka HomeViewController.h, które następnie trzeba zaimportować w dowolnym miejscu, w którym chcesz uzyskać dostęp do ciągów.

//HomeViewController.h 
extern NSString *AdStateDisabled; 
extern NSString *AdStateExpired; 
extern NSString *AdStateActive; 

Następnie zmień swoje definicje, aby usunąć "statyczne".

//HomeViewController.m 
NSString *AdStateDisabled = @"disable"; 
NSString *AdStateExpired = @"expired"; 
NSString *AdStateActive = @"active"; 

Jeśli nie chcemy, by użytkownik strun musieli importować HomeViewController.h następnie można też po prostu określić te ciągi w AdState.h i umieścić definicje w AdState.m (i usunąć je z HomeViewController.m), po którym użytkownicy ciągu będą musieli zaimportować AdState.h, aby użyć ciągów.

+0

Hej Zrobiłem już jakiś czas temu, nie ARC, ale w rzeczywistości można go używać w ARC, korzystając z metod przypisywania i określając silne lub słabe referencje. Jest nieco bliżej pierwotnego pytania: https://gist.github.com/darionco/03649feeee57f86fee3f – Dario

8

Najpierw usuń statyczne. Zmienne statyczne i funkcje w C i Objective-C oznaczają, że są widoczne tylko dla bieżącej jednostki kompilacji (to znaczy mniej więcej: tylko plik, który zadeklarowałeś w zmiennej statix, może ją zobaczyć).

Następnie trzeba także deklarować zmienne w pliku nagłówkowym publicznej „zewnętrzny”, jak jeden z klasy powiązanej z klasą:

extern NSString *AdStateDisabled; 

można następnie wykorzystać je w innych plikach jako dobrze, ale nie uzyskasz do nich dostępu jako "Ad.AdStateDisabled", ale jako "AdStateDisabled".