0
+ (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;
    }
}

やり過ぎのようです。より良い標準溶液があるのだろうか

4

1 に答える 1

1

ここ で非常に良い例とドキュメントを入手できます。

@synchronized(self)操作を同期するために使用できます。

于 2012-04-18T05:29:14.590 に答える