首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dispatch_async和retain (非弧)

dispatch_async和retain (非弧)
EN

Stack Overflow用户
提问于 2016-10-29 22:49:38
回答 1查看 487关注 0票数 0

在非ARC应用程序中,我有一个NSOperation子类,它由委托排队,如下所示:

代码语言:javascript
复制
// note that the delegate and element properties are retained

-(id)initWithDelegate:(id<SomeDelegate>)inDelegate element:(SomeElement *)inElement
{
    if (self = [super init])
    {
        [self setDelegate:inDelegate];
        [self setElement:inElement];
    }
}

-(void)dealloc
{
    [_delegate release];
    [_element release];
    [super dealloc];
}

-(void)main
{
    // do stuff

    dispatch_async(dispatch_get_main_queue(), ^{
         [[self delegate] doSomething:[self element]];
    });
}

由于[self委托doSomething:self元素]将在我的NSOperation对象可能已被释放后调用,所以在将此操作添加到队列之前,是否需要确保在委托中保留“元素”?元素对象保留在应用程序的其他地方,但可能会在那里发布。我需要确保当我的委托从NSOperation收到它时,它仍然是一个有效的对象。

只是想知道在dispatch_async中调用它的行为是否会保留传递给它的参数。当然,我可以使用NSInvocation和performSelectorOnMainThread来保留它。

EN

Stack Overflow用户

回答已采纳

发布于 2016-10-29 23:18:46

队列在进入队列时将保留块,块将保留它捕获的对象,如self。因为这里的self对它的element有很强的引用,所以element将至少在块运行之后才有效。

注意,对象对其委托的强烈引用是不寻常的:确保在那里没有一个完整的保留周期。

票数 5
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40324438

复制
相关文章

相似问题

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