2012-04-07 101 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這樣的標誌來解決問題,就像在你的示例代碼中一樣。

相關問題