我正在使用最新的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的概述部分,使用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
看起来更简单。