首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在objective-c中解除锁分配的正确方法是什么?

在objective-c中解除锁分配的正确方法是什么?
EN

Stack Overflow用户
提问于 2012-04-07 11:39:11
回答 1查看 694关注 0票数 2

我创建了一个NSObject,唯一的目的是锁定。我的问题是,在我的dealloc中,我如何释放(从内存中)锁。我读到过,您不应该在synchronized中修改锁对象。但在我的场景中,我认为在dealloc中的@synchronized完成后的这段时间内,从调用_lockObject释放的这段时间起,不同线程中的另一个方法可能会获取_lockObject。因此,如果在持有_lockObject的同时调用_lockObject release,可能会发生不好的事情。

在我的dealloc方法中处理锁的正确方法是什么?

代码语言:javascript
运行
复制
-(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;
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-07 11:56:39

当你的对象正在被另一个对象或线程使用时,它不能被释放。换句话说,任何调用你的对象的线程都已经持有对该对象的引用,该引用将阻止该对象释放。

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10051530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档