ロックのみを目的として、NSObject を作成しました。私の質問は、私のdeallocで、ロックを(メモリから)どのように解放するかです。同期内で lock-object を変更すべきではないことを読みました。しかし、私のシナリオでは、@synchronized in dealloc が完了してから [_lockObject release] が呼び出されるまでの間に、別のスレッドの別のメソッドが _lockObject を取得する可能性があると思います。したがって、_lockObject が保持されているときに [_lockObject release] が呼び出されると、悪いことが起こる可能性があります。
私の dealloc メソッドでロックを破棄する正しい方法は何ですか?
-(id)initWithImageFileName:(NSString*)imageFileName
{
if (self = [super init])
{
_imageFileName = [imageFileName retain];
_loadBackgroundCalled = NO;
_deallocing = NO;
_lockObject = [[NSObject alloc]init];
}
return self;
}
-(void)dealloc
{
_deallocing = YES;
@synchronized(_lockObject)
{
..... <releases some stuff>
}
[_lockObject release];
_lockObject = nil;
[_imageFileName release];
_imageFileName = nil;
[super dealloc];
}
-(void)loadBackground
{
@synchronized(_lockObject)
{
if (!_deallocing)
{
if (!_loadBackgroundCalled)
{
_loadBackgroundCalled = YES;
....
}
}
}
}
-(void)loadSprite:(XYTexture*)texture
{
@synchronized(_lockObject)
{
....
}
}
-(void)unloadBackground
{
@synchronized(_lockObject)
{
if (!_deallocing)
{
.....
_loadBackgroundCalled = NO;
}
}
}