私は iPhone 用のマルチスレッド アプリケーションを作成しており、NSLock を使用して、一部の操作 (ファイルからサウンドをロードするなど) がアトミックに動作するようにしています。アプリケーションのさまざまな部分から簡単にロックを取得するために、次のクラスを作成しました。これにより、名前を指定して NSString を渡すだけでロックをロックおよびロック解除できます。そのようなロックが存在しない場合は、それを作成して将来のために保存します。私はそれをテストしましたが、うまく動作しているようです (NSLock オブジェクトへのアクセスを提供するだけで、その動作を変更しないため)。
私の質問は、そのようなクラスを持って使用しても大丈夫ですか、それともロックの概念に誤解がありますか?
Locker.h
#import <Foundation/Foundation.h>
@interface Locker : NSObject { }
+ (void) purgeLocks;
+ (NSLock*) lockWithName: (NSString*) name;
+ (void) lock: (NSString*) name;
+ (void) unlock: (NSString*) name;
+ (BOOL) tryLock: (NSString*) name;
@end
Locker.m
#import "Locker.h"
static NSMutableDictionary* locks = nil;
@implementation Locker
+ (void) initialize {
locks = [[NSMutableDictionary dictionary] retain];
}
+ (void) purgeLocks {
[locks release];
[Locker initialize];
}
+ (NSLock*) lockWithName: (NSString*) name {
NSLock* lock = nil;
@synchronized([Locker class]) {
lock = [locks objectForKey: name];
if(!lock) {
lock = [[[NSLock alloc] init] autorelease];
[lock setName: name];
[locks setObject: lock forKey: name];
}
}
return lock;
}
+ (void) lock: (NSString*) name {
[[Locker lockWithName: name] lock];
}
+ (void) unlock: (NSString*) name {
[[Locker lockWithName: name] unlock];
}
+ (BOOL) tryLock: (NSString*) name {
return [[Locker lockWithName: name] tryLock];
}
@end