gpt4 book ai didi

iphone - ARC 不释放实例变量

转载 作者:行者123 更新时间:2023-11-28 20:36:27 25 4
gpt4 key购买 nike

我对 ARC 有疑问。经过几个小时的调试,我放弃了,决定在这里查看。

基本上我有一个 MainViewController,它创建了 PreviewsView 的实例。

PreviewsView 中,我有 delegate 和 dataSource 属性:

@property (nonatomic, unsafe_unretained) IBOutlet id<PreviewsDataSource> dataSource;
@property (nonatomic, unsafe_unretained) IBOutlet id<PreviewsDelegate> delegate;

我在 MainViewController 中创建了 PreviewsView 的实例,将 self 设置为 delegatedataSource,添加查看并保存为实例变量:

- (void)addPreviews {
previewsView = [[PreviewsView alloc] initWithFrame:CGRectMake(0, 75, 1024, 480)];
previewsView.dataSource = self;
previewsView.delegate = self;
[self.view addSubview:previewsView];
}

然后当我从导航 Controller ACR 中删除 MainViewController 时,但是 previewsView 仍然存在(为什么???)并且实际运行触发 的方法[self.delegate doSomeStuff]。由于 MainViewController 已经解除分配 - 它抛出 EXC_BAD_ACCESS

所以基本上:

  • MainViewController 的实例拥有 PreviewsView 的实例(previewsView)
  • MainViewController 的实例分配为 PreviewsView 中的 delegatedataSource
  • 在释放 MainViewController 实例后,previewsView 仍然存在并正在运行。

有什么想法吗?谢谢。

最佳答案

在像这样释放 MainViewController 之前,你需要将你的委托(delegate)设置为 nil previewsView.delegate = 无; previewsView.dataSource = nil;

最好在您的 MainViewController 的 dealloc 方法中调用此代码 -> 您仍然可以像这样在 ARC 中使用它

- (void) dealloc
{
previewsView.dataSource = nil;
previewsView.delegate = nil;
[super dealloc];
}

你应该记住协议(protocol)!假设!您的 previewsView 实例仍然“活着”(通知的工作方式相同)并尝试向您的实例发送消息,无论它是死是活。因此,当 MainViewController 被释放时,previewsView 也被释放,但代表仍然“活着”。因此,您需要通过将它们设置为 nil 来取消委托(delegate);)

关于iphone - ARC 不释放实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10336000/

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