保存标准方式来声明单例

时间:2012-04-18 05:18:27

标签: objective-c singleton xcode4.2

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

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


    return grab;
}

我在节目中使用了很多单身人士。如果我这样做,但是有可能同时由不同的线程调用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 个答案:

答案 0 :(得分:1)

您可以获得一个非常好的示例和文档here

您可以使用@synchronized(self)来同步操作。