在objective-c中解除锁定的正确方法是什么

时间:2012-04-07 03:39:11

标签: objective-c synchronization locking dealloc

我创建了一个NSObject,仅用于锁定。 我的问题是,在我的dealloc中,我如何释放(从内存中)锁。我已经读过你不应该在synchronized中修改lock-object。但在我的场景中,我认为在dealloc中的@synchronized完成之后的时间与调用[_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;
        }
    }
}

1 个答案:

答案 0 :(得分:4)

您的对象在被另一个对象或线程使用时无法释放。换句话说,任何调用对象的线程都将持有对所述对象的引用,该引用将阻止对象解除分配。

执行-dealloc方法时,您可以(并且必须)假设没有其他对象或线程拥有对象的引用,因此您不必担心并发。

如果在对象在单独的线程上执行时调用-dealloc,则表明应用程序中的错误与此特定对象无关。您无法通过设置_deallocing之类的标记来解决问题,如示例代码中那样。