2012-04-07 99 views
1

我创建了一个NSObject,仅用于锁定。 我的问题是,在我的dealloc中,我如何释放锁(从内存中)。我读过,你不应该修改同步内的锁对象。但是在我的场景中,我认为从dealloc中的@synchronized完成之后到[_lockObject release]被调用的时间之间,另一个线程中的另一个方法可能会获取_lockObject。因此,如果在_lockObject被保存的情况下调用[_lockObject release],可能会发生不好的事情。什么是正确的方式来释放锁在objective-c

在我的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; 
     } 
    } 
} 

回答

3

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

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

如果-dealloc在您的对象在单独的线程上执行时被调用,那么这将指示您的应用程序中与此特定对象无关的错误。你不能通过设置像_deallocing这样的标志来解决问题,就像在你的示例代码中一样。

相关问题