为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Objective-C中锁定/解锁@synchronized?

如何在Objective-C中锁定/解锁@synchronized?

湖上湖 2019-09-18 14:51:05
@synchronized不使用“锁定”和“解锁”来实现互斥吗?那怎么做锁定/解锁呢?以下程序的输出仅为“Hello World”。@interface MyLock: NSLock<NSLocking>@end@implementation MyLock- (id)init {    return [super init];}- (void)lock {    NSLog(@"before lock");    [super lock];    NSLog(@"after lock");}- (void)unlock {    NSLog(@"before unlock");    [super unlock];    NSLog(@"after unlock");}@endint main (int argc, const char * argv[]) {    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];    MyLock *lock = [[MyLock new] autorelease];    @synchronized(lock) {        NSLog(@"Hello World");    }    [pool drain];}
查看完整描述

3 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

在Objective-C中,@synchronized块自动为您处理锁定和解锁(以及可能的异常)。运行时动态地生成一个NSRecursiveLock,它与您正在同步的对象相关联。Apple文档更详细地解释了它。这就是为什么你没有看到NSLock子类的日志消息 - 你同步的对象可以是任何东西,而不仅仅是一个NSLock。


基本上,@synchronized (...)是一种简化代码的便捷结构。像大多数简化的抽象一样,它具有相关的开销(将其视为隐藏成本),并且很好地意识到这一点,但是无论如何使用这样的构造时,原始性能可能不是最高目标。


查看完整回答
反对 回复 2019-09-18
?
长风秋雁

TA贡献1757条经验 获得超7个赞

其实


{

  @synchronized(self) {

    return [[myString retain] autorelease];

  }

}

直接转换为:


// needs #import <objc/objc-sync.h>

{

  objc_sync_enter(self)

    id retVal = [[myString retain] autorelease];

  objc_sync_exit(self);

  return retVal;

}

此API自iOS 2.0起可用并使用...


#import <objc/objc-sync.h>


查看完整回答
反对 回复 2019-09-18
  • 3 回答
  • 0 关注
  • 644 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信