Witam
Czy w ObjC można stworzyć obiekt który będzie dostępny dla innych obiektów, tak jakby globalnie, czy zawsze trzeba przekazywać jego pointer innym obiektom, aby mogły korzystać z jego zmiennych i metod instancyjnych?
ObjC obiekt dostępny dla innych obiektów
Rozpoczęty przez
uho
, 03 lip 2011 06:45
4 odpowiedzi w tym temacie
#1
Napisano 03 lipca 2011 - 06:45
#2
Napisano 03 lipca 2011 - 08:41
Można. Hasło: singleton
#3
Napisano 04 lipca 2011 - 14:31
static KKAchievements *instanceOfKKAchievements; @implementation KKAchievements +(id) alloc { @synchronized(self) { NSAssert(instanceOfKKAchievements == nil, @"Attempted to allocate a second instance of the singleton: KKAchievements"); instanceOfKKAchievements = [[super alloc] retain]; return instanceOfKKAchievements; } // to avoid compiler warning return nil; } +(KKAchievements*) sharedKKAchievements { @synchronized(self) { if (instanceOfKKAchievements == nil) { [[KKAchievements alloc] init]; //[[GCCache activeCache] reset]; } return instanceOfKKAchievements; } // to avoid compiler warning return nil; }
Kawałek kodu jednej z moich klas (singleton zarządzający achievementami w grze). W klasie tworzysz jedną zmienną statyczną, która przechowuje wskaźnik do singletona. Zasada działania singletona jest taka, że tworzy on tylko jedną instancję.
Później w kodzie możesz się do niego odwołać:
KKAchievements* achievements = [KKAchievements sharedKKAchievements];
#4
Napisano 04 lipca 2011 - 16:01
Dzieki, znalazłem już przykład takiej klasy, właśnie ją implementuje w swoim projekcie.
#5
Napisano 04 lipca 2011 - 17:51
maly update do powyzszej metody. jest ona oczywiscie poprawna, ale zalecane obecnie jest wykorzystanie Grand Central Dispatch (GCD) i funkcja w/g 'nowych wytycznych' powinna wygladac tak:
+ (id) sharedInstance { static MyClass *instance; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[MyClass alloc] init]; }); return instance; }
Użytkownicy przeglądający ten temat: 1
0 użytkowników, 1 gości, 0 anonimowych