在C++下,我有一个Mutex类,我使用这个RAII风格的类来确保互斥锁被解锁,无论方法返回的原因是什么:
class MutexLock {
protected:
Mutex &m_mutex;
public:
MutexLock(Mutex &mutex) :
m_mutex(mutex) {
m_mutex.lock();
}
~MutexLock() {
m_mutex.unlock();
}
};
Run Code Online (Sandbox Code Playgroud)
是否有任何原因,并且在使用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
Run Code Online (Sandbox Code Playgroud)
可以通过以下方式使用:
NSLock *_lock; // instance variable
- (void)myFunc {
Locker *locker = [[Locker alloc] init];
locker.lock = _lock;
return; // Whenever I like …Run Code Online (Sandbox Code Playgroud) 我在NSDictionary类别中有以下方法,可以进行深层复制,工作正常.
我刚从Xcode 4.1升级到4.2,Analyze函数为此代码提供了两个分析器警告,如下所示:
- (id)deepCopy;
{
id dict = [[NSMutableDictionary alloc] init];
id copy;
for (id key in self)
{
id object = [self objectForKey:key];
if ([object respondsToSelector:@selector(deepCopy)])
copy = [object deepCopy];
else
copy = [object copy];
[dict setObject:copy forKey:key];
// Both -deepCopy and -copy retain the object, and so does -setObject:forKey:, so need to -release:
[copy release]; // Xcode 4.2's Analyze says this is an incorrect decrement of the reference count?!
}
return dict; // Xcode 4.2's Analyze says …Run Code Online (Sandbox Code Playgroud)