假设这些是实例方法,并调用-run
。
时间self
发布时-run
上的锁定是否会返回?
...
- (void)dangerous {
@synchronized (self) {
[NSException raise:@"foo" format:@"bar"];
}
}
- (void)run {
@try { [self dangerous]; }
@catch (NSException *ignored) {}
}
...
答案 0 :(得分:10)
@synchronized(obj) { code }
块实际上等同于
NSRecursiveLock *lock = objc_fetchLockForObject(obj);
[lock lock];
@try {
code
}
@finally {
[lock unlock];
}
虽然这方面的任何特定方面实际上只是实现细节。但是,无论控件如何退出块,@synchronized
块都可以保证释放锁。
答案 1 :(得分:4)
是的,是的。
self
锁定将在您的进程从@synchronized (self) {}
阻止后退出。
答案 2 :(得分:4)
是的,当-dangerous返回时(即使是异常),锁定被释放。 @synchronized添加了一个隐式异常处理程序来释放互斥锁。