@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 (...)是一种简化代码的便捷结构。像大多数简化的抽象一样,它具有相关的开销(将其视为隐藏成本),并且很好地意识到这一点,但是无论如何使用这样的构造时,原始性能可能不是最高目标。
长风秋雁
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>
- 3 回答
- 0 关注
- 693 浏览
添加回答
举报
0/150
提交
取消