objective-c - @synchronized block 是否保证释放它们的锁?

标签 objective-c macos cocoa

假设这些是实例方法并且调用了-run

-run 返回时是否释放了对 self 的锁定?

...
- (void)dangerous {
    @synchronized (self) {
        [NSException raise:@"foo" format:@"bar"];
    }
}

- (void)run {
    @try { [self dangerous]; }
    @catch (NSException *ignored) {}
}
...

最佳答案

@synchronized(obj) { code } block 实际上等同于

NSRecursiveLock *lock = objc_fetchLockForObject(obj);
[lock lock];
@try {
    code
}
@finally {
    [lock unlock];
}

尽管这方面的任何特定方面实际上都只是实现细节。但是,是的,无论控制如何退出 block ,@synchronized block 都保证释放锁。

关于objective-c - @synchronized block 是否保证释放它们的锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7735799/

相关文章:

ios - iOS 中场景和 View 的区别

cocoa - 处理Webview中的超时

objective-c - 从 NSTextField 子类调用 NSObject 方法?

ios - 什么是 NSNotFound 的 float

iphone - 自动发布在 Objective-C 中是如何工作的?

c++ - c++中的线程,不能使用参数

macos - 尽管 header 注释,在 Swift 中采用 NSTextFinderBarContainer 协议(protocol)会强制变量初始化

xcode - XIB 中的 NSSplitViewController/NSSplitViewItem 支持

objective-c - 使用 Cocoa 在 Objective-C 的事件处理程序中移除本地事件监视器的竞争条件

cocoa - "to-many"关系是否应该建模为属性?