2

ロックのみを目的として、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;
        }
    }
}
4

1 に答える 1

4

オブジェクトが別のオブジェクトまたはスレッドによって使用されている間は、オブジェクトの割り当てを解除できません。つまり、オブジェクトを呼び出すスレッドは、そのオブジェクトへの参照を既に保持しており、その参照によってオブジェクトの割り当てが解除されなくなります。

メソッドが実行されると、他のオブジェクトやスレッドがそのオブジェクトへの参照を保持していないと想定できます-dealloc(そして想定する必要があります)。したがって、同時実行性について心配する必要はありません。

オブジェクトが別のスレッドで実行されているときに が呼び出された場合-dealloc、この特定のオブジェクトとは関係のないアプリケーションのバグを示しています。_deallocingサンプルコードのように、のようなフラグを設定しても問題は解決しません。

于 2012-04-07T03:56:39.497 に答える