gpt4 book ai didi

objective-c - 我可以在具有自己的回调 block 的方法中释放 Controller 吗?

转载 作者:行者123 更新时间:2023-12-03 17:10:01 25 4
gpt4 key购买 nike

我有一个关于使用回调 block 来释放给定堆栈帧中所有 Controller 的一般问题。目前这正在按预期工作,并且 Controller 正在收到一条 dealloc 消息,并且没有其他明显的问题。 (在我看来)这对于显示 transient 弹出窗口、对话框和其他 View 而不需要维护主机类中的 ivars 或其他状态非常有用。如果 Controller 的 xib 设置为在关闭时释放,这将变得干净整洁。

这是一般模式:

- (void)showTransientView
{
MyCustomController *controller = nil;

void(^completeBlock)(ResponseCodeType) = ^(ResponseCodeType response){
if (response == ResponseOk){
[self transientViewDidEnd:controller];
}

[controller autorelease]; //project is not using ARC
};

controller = [[MyCustomController alloc] initWithCallback:completeBlock];
}

我的问题基本上是这里是否存在我没​​有考虑到的隐藏问题或其他反对意见?

此外,除了明显删除 [controller autorelease] 之外,打开 ARC 时还会发生什么变化?

最佳答案

不知道为什么你在这里做autorelease,因为看起来一个简单的release应该完成这项工作,似乎你只是在平衡alloc

<小时/>

使用 ARC 时,没有任何东西保留该 Controller ,因此它会立即在此处释放。

您可以稍微调整一下,以便在实例化后传递完成,这样 block 将实际捕获实例,这就是我相信您正在尝试实现的目标。

您还需要添加__block存储说明符来修改 block 内的controller并在 Controller 外nil,以便ARC将发送发布

__block MyCustomController *controller = MyCustomController.new;

controller.completion = ^{
controller = nil;
};

// Using weak in this example to ensure the dispatch_after is not the thing holding onto our controller
__weak __typeof(controller) weakController = controller;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
weakController.completion();
});

关于objective-c - 我可以在具有自己的回调 block 的方法中释放 Controller 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36628613/

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