cuốn sách gpt4 ai đã làm

iphone - ARC 不释放实例变量

In lại Tác giả: Walker 123 更新时间:2023-11-28 20:36:27 26 4
mua khóa gpt4 Nike

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

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

hiện hữu PreviewsView 中,我有 delegate 和 dataSource 属性:

@property (nonatomic, unsafe_unretained) IBOutlet id dataSource;
@property (nonatomic, unsafe_unretained) IBOutlet id delegate;

tôi ở đây MainViewController 中创建了 PreviewsView 的实例,将 self đặt thành delegatenguồn dữ liệu,添加查看并保存为实例变量:

- (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 TRONG delegatenguồn dữ liệu
  • 在释放 MainViewController 实例后,previewsView 仍然存在并正在运行。

Có ý tưởng gì không? Cảm ơn.

câu trả lời hay nhất

在像这样释放 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/

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress