gpt4 book ai didi

objective-c - 在转换为 ARC 时,如何确保 Controller 在完成处理之前一直保留?

转载 作者:可可西里 更新时间:2023-11-01 05:10:35 25 4
gpt4 key购买 nike

我在我的应用中使用了以下模式并正在过渡到 ARC。基本上,一个对象保留一个 Controller 的实例,并在通过委托(delegate)协议(protocol)通知它已完成时释放该 Controller 。我不使用 iVar/property b/c startProcess 可以调用 N 次来处理 N 件事。

示例如下:

// start a process in a controller
- (void)startProcess
{
MyController *controller = [[MyController alloc] init];
// set the delegate, the delegate is defined as (nonatomic, assign)
controller.delegate = self;
[controller start];
}

// when the delegate is notified, release the controller
- (void)myControllerDidFinish:(MyController):controller
{
// do something with results
[controller release];
}

当上述实现转换为 ARC 时, Controller 在 startProcess 结束后不再保留,因此不会发生处理并且永远不会收到委托(delegate)消息。

问题:当将我的项目转换为使用 ARC 时,如何修改上述实现以在不在实例化 Controller 的对象中创建 iVar 的情况下正常工作? Apple 的文档中有一个类似的示例,用于过渡到 ARC,但它涉及使用 block 。我不想用完成 block 替换委托(delegate)协议(protocol)。

编辑:在代码中添加关于如何定义委托(delegate)的注释

编辑:澄清第一段以解释为什么持有 Controller 的 iVar/属性不起作用

最佳答案

为什么不创建一个 NSMutableArray 实例变量,pendingControllers,然后在其中添加您的 Controller ?由于数组保留了它们的成员,因此您的代码将如下所示:

// start a process in a controller
- (void)startProcess
{
MyController *controller = [[MyController alloc] init];
// set the delegate, the delegate is defined as (nonatomic, assign)
controller.delegate = self;
[controller start];

if (pendingControllers == nil) {
pendingControllers = [[NSMutableArray alloc] init];
}
[pendingControllers addObject:controller];
[controller release];
}

// when the delegate is notified, release the controller
- (void)myControllerDidFinish:(MyController):controller
{
// do something with results
[pendingControllers removeObject:controller];
if ([pendingControllers count] == 0) {
// if ARC is enabled, remove the call to -release.
[pendingControllers release], pendingControllers = nil;
}
}

这样就避免了这个问题。完成 block 正确的答案,它们也是 Apple future 使用的方法,但这种方法目前有效。

关于objective-c - 在转换为 ARC 时,如何确保 Controller 在完成处理之前一直保留?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7869073/

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