首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MCSession需要很长时间才能脱胶。

MCSession需要很长时间才能脱胶。
EN

Stack Overflow用户
提问于 2014-01-31 15:33:35
回答 2查看 442关注 0票数 2

我用的是多点连接。

当会话结束时,应用程序会出现在主菜单上,所有网络内容都会被释放,然后被取消分配。

但是我的dealloc方法是在主线程中调用的,MCSession对象需要很长时间才能释放自己,我不知道为什么,因此主菜单屏幕冻结了。

如果有人知道为什么MCSession会这么长,我很感兴趣。但是,如果它来自MCSession本身,那么这样做是一个好的解决方案吗?

代码语言:javascript
复制
-(void) dealloc
{
    //... other release

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [_session release];
        _session = nil;
    });

    [super dealloc];
}

编辑:不,这绝对不是一个好的解决方案,因为它使我的应用程序崩溃。不管怎样,还有其他的想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-03 18:31:37

当您调用[_session release]时,因为_session是Ivar,编译器将用[self->_session release]替换这一行,而块将保留self而不是iVar _session。这里有两个问题:

  1. 试图保留正在释放的对象(Self)。
  2. 当队列被执行时,它将调用已被解除分配的self。

下面的解决方案创建一个局部变量,它指向与iVar相同的地址,并在块中释放它,块将不会捕获self。

代码语言:javascript
复制
-(void) dealloc
{
    //... other release
    MCSession* localSession = _session;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [localSession release];
    });

    [super dealloc];
}
票数 2
EN

Stack Overflow用户

发布于 2014-03-20 15:52:37

bsarr007 007的解决方案将适用于非ARC项目。如果您正在使用ARC,您可以尝试如下:

代码语言:javascript
复制
__block MCSession *localSession = _session;
_session = nil;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    oldSession = nil;
});

对我来说很管用。我在这里所做的是通过创建指向该对象的新局部变量来增加MCSession对象的引用计数,因此在设置_session = nil时不会立即将其释放。之后,我将使用后台队列异步运行减少MCSession对象引用计数器的代码。

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

https://stackoverflow.com/questions/21483825

复制
相关文章

相似问题

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