我用的是多点连接。
当会话结束时,应用程序会出现在主菜单上,所有网络内容都会被释放,然后被取消分配。
但是我的dealloc方法是在主线程中调用的,MCSession对象需要很长时间才能释放自己,我不知道为什么,因此主菜单屏幕冻结了。
如果有人知道为什么MCSession会这么长,我很感兴趣。但是,如果它来自MCSession本身,那么这样做是一个好的解决方案吗?
-(void) dealloc
{
//... other release
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[_session release];
_session = nil;
});
[super dealloc];
}编辑:不,这绝对不是一个好的解决方案,因为它使我的应用程序崩溃。不管怎样,还有其他的想法吗?
发布于 2014-02-03 18:31:37
当您调用[_session release]时,因为_session是Ivar,编译器将用[self->_session release]替换这一行,而块将保留self而不是iVar _session。这里有两个问题:
下面的解决方案创建一个局部变量,它指向与iVar相同的地址,并在块中释放它,块将不会捕获self。
-(void) dealloc
{
//... other release
MCSession* localSession = _session;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[localSession release];
});
[super dealloc];
}发布于 2014-03-20 15:52:37
bsarr007 007的解决方案将适用于非ARC项目。如果您正在使用ARC,您可以尝试如下:
__block MCSession *localSession = _session;
_session = nil;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
oldSession = nil;
});对我来说很管用。我在这里所做的是通过创建指向该对象的新局部变量来增加MCSession对象的引用计数,因此在设置_session = nil时不会立即将其释放。之后,我将使用后台队列异步运行减少MCSession对象引用计数器的代码。
https://stackoverflow.com/questions/21483825
复制相似问题