3

最新の SDK を使用して iOS アプリケーションを開発しています。

私のアプリは Android アプリケーションからの移植であり、次の 2 つの方法があります。

- (MyObject*)getMyObject:(MyObjectType)myObjectType
{
    @synchronized(self)
    {
        for (int index = 0; index < [myObjects count]; index++)
        {
            MyObject* myObject = (MyObject*)[myObjects objectAtIndex:index];
            if (myObject.Type == myObjectType)
                return myObject;
        }

        return nil;
    }
}

- (BOOL)isMyObjectVisible:(MyObjectType)myObjectType
{
    @synchronized(self)
    {
        return ([self getMyObject:myObjectType] != nil);
    }
}

isMyObjectVisible:つまり、別のメソッド@synchronizedを呼び出しています。@synchronized

である必要がisMyObjectVisible:あります@synchronizedか?

4

2 に答える 2

1

最初の質問に答えるには、いいえ、二重ロックは必要ありません。

鍵をかけたままにできますgetMyObject。それはそれを保護します。ただし、isMyObjectVisibleへの呼び出し以外には何もないため、そのメソッドで保護するものはgetMyObjectにありません。

ただし、borrrden のコメントはここでは問題ではありません。@synchronized を使用すると再帰ロックが発生するため、デッドロックなしで行っているように呼び出しをネストできます。あなたの場合、その必要はありません。synchronized

于 2013-04-03T09:26:23.467 に答える
1

double @synchronized を使用する必要がある例を次に示します。

NSString * str;
str = [[NSString alloc] initWithFormat:@"str"];

-(void)viewDidLoad{

  NSString *foo = @"foo";
  NSString *bar = @"bar";
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  [self firstAction:foo];
  });
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  [self secondAction:bar];
  });
}
- (void)firstAction:(NSString *)sender {
    NSLog(@"firstAction");
    @synchronized (self) {
        str = sender;
        for (int i=0; i<5; i++) {
            NSLog(@"first: %@",str);
        }
    }
}

- (void)secondAction:(NSString *)sender {
        NSLog(@"secondAction");
        @synchronized (self) {
            str = sender;
            for (int i=0; i<5; i++) {
                NSLog(@"second: %@",str);
            }
        }  
 }

(str は静的変数です) - @synchronized (self) なしで実行してみて、どうなるか見てみましょう。

于 2015-05-20T10:14:14.677 に答える