gpt4 book ai didi

ios - ARC 在调用完成处理程序 block 之前释放我的对象

转载 作者:行者123 更新时间:2023-11-29 11:03:52 24 4
gpt4 key购买 nike

我将 UIAlertView 包装在常规 NSObject 中,以允许完成处理程序 block 而不是委托(delegate)模式。

问题是我分配了对象的本地实例,它在内部创建了一个 UIAlertView 并将其委托(delegate)分配给对象本身。当显示警报并且用户点击按钮时,应用程序崩溃并显示 EXC_BAD_ACCESS,因为 ARC 已经释放了我的对象并且警报的代表是那个对象。

我该如何处理这种情况?我看到一个解决方案是用 __block 限定局部变量并在完成 block 中使用对象本身,但这不起作用。

顺便说一句,如果我将“UIalertView”子类化而不是包装它,它就可以工作,但文档说不建议使用警报子类化,所以我更愿意解决这个问题。

最佳答案

您可以像这样将您的对象与警报 View 相关联:

#import <objc/runtime.h>

...

- (void)showAlertView
{
UIAlertView *alertView = [[UIAlertView alloc] initWithWhatever:...];
objc_setAssociatedObject(alertView, _cmd, self, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[alertView show];
}

这将保留您的对象,然后在释放 alertView 时再次释放它。您的对象不得保留 alertView,否则您将有一个保留周期。

关于ios - ARC 在调用完成处理程序 block 之前释放我的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14563287/

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