2012-04-18 18 views
0
+ (GrabClass *)grab{ 
    static GrabClass * ngrab = nil; 

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


    return grab; 
} 

我在程序中使用了很多單身人士。如果我這樣做,但是抓取方法有可能被不同的線程同時調用。保存標準的聲明一個單身人士的方式

如何避免它?

我目前的解決辦法是要做到:

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

    return grab; 
} 

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

好像矯枉過正。我不知道是否有更好的標準解決方案

+1

可能重複的[單線程安全實例化](http://stackoverflow.com/questions/2199106/thread-safe-instantiation-of-a-singleton) – 2012-04-18 05:41:49

+0

和幾乎ObjC單身人士的權威SO帖子:http://stackoverflow.com/questions/145154/what-does-your-objective-c-singleton-look-like – 2012-04-18 05:42:34

+0

無論如何你如何找到所有這些重複? +1 – 2012-04-18 06:25:02

回答

1

你可以得到一個很好的例子和文檔here。可以使用@synchronized(self)來同步操作。

+0

+1爲我示範,並給我文檔 – 2012-04-18 06:25:26