/ / Zapisz standardowy sposób deklarowania singletona - cel-c, singleton, xcode4.2

Zapisz standardowy sposób deklarowania singleton - target-c, singleton, xcode4.2

+ (GrabClass *)grab{
static GrabClass * ngrab = nil;

if (ngrab==nil)
{
ngrab=[[GrabClass alloc]init];
}


return grab;
}

W swoim programie wykorzystałem wiele singletonów. Jeśli zrobię to w ten sposób, istnieje jednak szansa, że ​​metoda grab zostanie wywołana przez różne wątki jednocześnie.

Jak tego uniknąć?

Moje obecne rozwiązanie to:

+ (GrabClass *)grab{
static GrabClass * ngrab = nil;
[Tools DoSomethingWithSynchronize:^{
if (ngrab==nil)
{
ngrab=[[GrabClass alloc]init];
}
}];

return grab;
}

Gdzie

+(void)DoSomethingWithSynchronize:(void (^)())block
{
@synchronized (self)
{
[self singleton].lockToMakeSureThatOnlyOneThreadAccessThis=[NSThread currentThread];
[self breakIfLock]; //should not be called
block();
[self singleton].lockToMakeSureThatOnlyOneThreadAccessThis=nil;
}
}

Wygląda na przesadę. Zastanawiam się, czy istnieje lepsze standardowe rozwiązanie

Odpowiedzi:

1 dla odpowiedzi № 1

Możesz uzyskać bardzo dobry przykład i dokumentację tutaj.

Możesz po prostu użyć @synchronized(self) zsynchronizować operacje.