gpt4 book ai didi

objective-c - 过渡到 ARC 导致委托(delegate)问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:50:06 25 4
gpt4 key购买 nike

将项目转换为 ARC 后,我遇到了一些问题,委托(delegate)方法未被调用/未被释放的实例被调用。我已经意识到问题是我有一个变量被分配然后执行一个异步任务。举一个简单的例子,假设有一个名为 MyService 的对象响应委托(delegate)方法 executeDidSucceed:

- (void)fireRequest {
MyService *service = [[MyService alloc] initWithDelegate:self];
[service execute];
}

原始代码看起来像这样:

- (void)fireRequest {
MyService *service = [[[MyService alloc] initWithDelegate:self] autorelease];
[service execute];
}

使用 ARC,我了解到在调用 [service execute] 之后添加了一个 release 调用。而且我还了解到,因为该方法是异步的,所以 service 对象将被释放,并且将为委托(delegate)方法调用释放的对象。

我知道一个解决方案是让 service 成为一个实例变量并赋予它 strong 属性,这样我们就可以保留它的所有权。我知道一个解决方案,我们可以创建一个 block 并使用完成处理程序,这样委托(delegate)就会保留直到 block 完成。我的问题是,处理这种情况的最佳方法是什么?或者更确切地说,在过渡到 ARC 时解决此问题的“最佳实践”是什么?

最佳答案

您需要使您的 Myservice 对象成为此类的成员。一旦这个函数完成,ARC 就会清理它,因为你不再有对它的引用。

我还认为这是一个很好的做法,因为在它调用委托(delegate)(如果有)之前您没有对该对象的引用,并且根据情况,您可能需要在服务完成之前停止该服务。

关于objective-c - 过渡到 ARC 导致委托(delegate)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12786748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com