2

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

我有这个代码:

@interface ServerManager()
{
    NSCondition* statusLock;

[ ... ]

}

@end

@implementation ServerManager

[ ... ]

- (void)setStatus:(ServerStatus)newStatus
{
    [statusLock lock];

    status = newStatus;

    [statusLock unlock];
}

如果我- (void)setStatus:(ServerStatus)newStatus用这个改变实现:

- (void)setStatus:(ServerStatus)newStatus
{
    @synchronized(statusLock)
    {
        status = newStatus;
    }
}

我也在做同样的事情吗?

这是我第一次使用 NSThread,我不知道锁是如何在 iOS 上工作的。

4

1 回答 1

2

我的理解是这两段代码是等价的——为了和 with 做同样的事情NSCondition@synchronized你必须编写更多的代码。根据文档的概述部分,setStatus实现NSCondition应该如下所示:

- (void)setStatus:(ServerStatus)newStatus
{
    static BOOL safe_to_set_status = YES;
    [statusLock lock];
    while (!safe_to_set_status) {
        [statusLock wait];
    }
    safe_to_set_status = NO;
    status = newStatus;
    safe_to_set_status = YES;
    [statusLock signal];
    [statusLock unlock];
}

如果您所需要的只是防止并发修改,那么使用@synchronized看起来是一个更简单的选择。

于 2013-04-22T10:32:33.640 回答