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

标签 objective-c synchronization locking dealloc

我创建了一个 NSObject,其唯一目的是锁定。 我的问题是,在我的释放中,如何释放(从内存中)锁。我读到你不应该修改同步中的锁对象。但在我的场景中,我认为在 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;
        }
    }
}

最佳答案

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

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

如果当您的对象在单独的线程上执行时调用-dealloc,那么这将表明您的应用程序中存在与该特定对象无关的错误。您不能通过设置诸如 _deallocing 之类的标志来解决问题,如示例代码中所示。

关于objective-c - 在 Objective-C 中解除锁定的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10051530/

相关文章:

ios - 日期计算过程中的奇怪错误

session - 共置缓存上的 Azure session

amazon-web-services - 将 Amazon Cognito 与 Ionic 集成以实现离线同步

ios - Instagram 自动发布或通过第三方应用程序在 IOS 中一键分享

iphone - iOS - 从 MFMailComposeViewController 中删除 UIImageView

java - 解决获取多个锁时的死锁

rust - Arc 是否允许 RwLock 拥有多个写入器?

java - 在 Coldfusion 9 上使用 cflock 排队

ios - 在 didSelectrow uitableview 中调用多个 View Controller

c - struct pthread_rwlock_t 成员说明