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

@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");

}


@end



int main (int argc, const char * argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];


    MyLock *lock = [[MyLock new] autorelease];

    @synchronized(lock) {

        NSLog(@"Hello World");

    }


    [pool drain];

}


湖上湖
浏览 694回答 3
3回答

慕容3067478

在Objective-C中,@synchronized块自动为您处理锁定和解锁(以及可能的异常)。运行时动态地生成一个NSRecursiveLock,它与您正在同步的对象相关联。Apple文档更详细地解释了它。这就是为什么你没有看到NSLock子类的日志消息 - 你同步的对象可以是任何东西,而不仅仅是一个NSLock。基本上,@synchronized (...)是一种简化代码的便捷结构。像大多数简化的抽象一样,它具有相关的开销(将其视为隐藏成本),并且很好地意识到这一点,但是无论如何使用这样的构造时,原始性能可能不是最高目标。

长风秋雁

其实{&nbsp; @synchronized(self) {&nbsp; &nbsp; return [[myString retain] autorelease];&nbsp; }}直接转换为:// needs #import <objc/objc-sync.h>{&nbsp; objc_sync_enter(self)&nbsp; &nbsp; id retVal = [[myString retain] autorelease];&nbsp; objc_sync_exit(self);&nbsp; return retVal;}此API自iOS 2.0起可用并使用...#import <objc/objc-sync.h>
打开App,查看更多内容
随时随地看视频慕课网APP