我正在使用最新的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上的工作方式。

最佳答案

我的理解是,这两段代码并不等效-为了使用NSCondition@synchronized做相同的事情,您将不得不编写更多的代码。根据documentation的概述部分,使用setStatusNSCondition实现应如下所示:

- (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看起来更简单。

10-05 20:03