gpt4 book ai didi

c++ - 这个 RAII 风格的 Objective-C 类可以工作吗?

转载 作者:可可西里 更新时间:2023-11-01 18:20:13 25 4
gpt4 key购买 nike

在 C++ 下,我有一个 Mutex 类,我使用这个 RAII 风格的类来确保互斥锁被解锁,无论方法返回的原因是什么:

class MutexLock {
protected:
Mutex &m_mutex;
public:
MutexLock(Mutex &mutex) :
m_mutex(mutex) {
m_mutex.lock();
}

~MutexLock() {
m_mutex.unlock();
}
};

有什么理由,在使用 ARC 时,等效的 Objective-C 类不能正常工作:

@interface Locker : NSObject {
NSLock *_lock;
}
- (void)setLock:(NSLock *)lock;
@end

@implementation Locker

- (void)setLock:(NSLock *)lock {
[_lock unlock];
_lock = lock;
[_lock lock];
}

- (void)dealloc {
self.lock = nil;
}
@end

可以按以下方式使用:

NSLock *_lock;    // instance variable

- (void)myFunc {
Locker *locker = [[Locker alloc] init];
locker.lock = _lock;

return; // Whenever I like
}

我知道它在 Objective-C 异常的情况下不起作用,这与 C++ 版本不同,但假设所有 Objective-C 异常都是致命的,我并不担心这一点。

更新 刚刚启动了一个快速测试,它似乎工作正常。看这个gist .

最佳答案

更好的 API:使用 block :

void performBlockWithLock(NSLock *lock, void (^block)(void)) {
[lock lock];
block();
[lock unlock];
}

例子:

NSLock *someLock = ...;
performBlockWithLock(someLock, ^{
// your code here
});

关于c++ - 这个 RAII 风格的 Objective-C 类可以工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19551973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com