首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在异步块中使用release的ios

在异步块中使用release的ios
EN

Stack Overflow用户
提问于 2014-01-18 08:21:47
回答 1查看 307关注 0票数 0

我有一个IOS项目(ARC禁用),它有几个视图控制器。一个特定的控制器初始化MyClass类型的成员对象,但是当视图控制器被清除时,我调用对象的清理方法,该方法使用线程(使用dispatch-async)进行一些耗时的操作,然后当这些操作完成时,im在对象的主队列上执行自我释放。这是一个很好的实践吗?它会导致任何错误吗?下面是一个与我所做的类似的例子:

代码语言:javascript
复制
@implementation ViewController

- (void)viewDidLoad
{
    myObj = [[MyClass alloc] init];
}

-(void)viewWillDisappear
{
    [myObj cleanup];
}

@end

//myClass
@implementation MyClass

- (void)cleanup()
{
   dispatch_queue_t myQueue = dispatch_queue_create ("MyClassDeallocQueue", NULL);
   dispatch_async(myQueue, ^{
        //time consuming operations        

        dispatch_async(dispatch_get_main_queue(), ^{
        [self release];
        });
   });

}

@end
EN

回答 1

Stack Overflow用户

发布于 2014-01-21 23:33:53

这是一个很好的实践吗?它会导致任何错误吗?

目前,您的代码具有不平衡的保留/释放。这绝对是一个错误(在发布的时候)。

“这是不是很好的练习?”--我不知道你想要达到什么目的。但是,如果您的目标是在块执行之前保持self的活动状态,那么它已经完全通过捕获self这一事实来实现了。因此,严格来说,不需要release

但是,如果您不显式地在主线程上释放self,就会引入一个微妙的bug:可能发生的情况是,该块具有对self的最后一个引用,并且由于它可能在某个任意线程上执行,因此它将在这个非主线程上释放self。这是被禁止的:必须在主线程上调用UIKit方法(包括dealloc)!

因此,这可能是有意义的:

代码语言:javascript
复制
   [self retain];
   dispatch_async(myQueue, ^{
        // time consuming operation, which captures `self`        
        [self doSomething];
        ...
        // ensure that `dealloc` will be executed on the main thread, if 
        // last reference is held by the block:
        dispatch_async(dispatch_get_main_queue(), ^{
            [self release];
        });
   });

或更短:

代码语言:javascript
复制
   dispatch_async(myQueue, ^{
        // time consuming operation, which captures `self`        
        [self doSomething];
        ...
        // ensure that `dealloc` will be executed on the main thread, if 
        // last reference is held by the block:
        dispatch_async(dispatch_get_main_queue(), ^{
            [self self];
        });
   });

编辑:

这是一个有趣的问题,“短”版本是否真的是踏板安全或有一个比赛:

假设self将在myQueue上执行的块中释放,因为在捕获self之前捕获self的效果将保留在相同的块中,就像捕获在主队列上执行的块的self的效果一样。那么,我们就有一个问题了。感谢您的评论。

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

https://stackoverflow.com/questions/21198398

复制
相关文章

相似问题

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