Skocz do zawartości

Witaj!

Zaloguj lub Zarejestruj się aby uzyskać pełny dostęp do forum.

Zdjęcie
- - - - -

ObjC obiekt dostępny dla innych obiektów


  • Zaloguj się, aby dodać odpowiedź
4 odpowiedzi w tym temacie

#1 uho

uho
  • 207 postów
  • SkądŁuków, PL

Napisano 03 lipca 2011 - 06:45

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?

#2 Roberto

Roberto
  • 13 752 postów
  • SkądWrocław

Napisano 03 lipca 2011 - 08:41

Można. Hasło: singleton

#3 ishadow

ishadow
  • 288 postów

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 uho

uho
  • 207 postów
  • SkądŁuków, PL

Napisano 04 lipca 2011 - 16:01

Dzieki, znalazłem już przykład takiej klasy, właśnie ją implementuje w swoim projekcie.

#5 wezuwiusz

wezuwiusz
  • 783 postów
  • SkądDublin, Katowice

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