3

我正在使用最新的 SDK 开发一个 iOS 应用程序。

我的应用程序是 Android 应用程序的一个端口,我有以下两种方法:

- (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 回答