我对 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 delegate
Và nguồ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 delegate
Và nguồn dữ liệu
- 在释放
MainViewController
实例后,previewsView 仍然存在并正在运行。
Có ý tưởng gì không? Cảm ơn.
在像这样释放 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);)
Tôi là một lập trình viên xuất sắc, rất giỏi!