我对ARC有问题。经过几个小时的调试,我放弃了,并决定在此处进行检查。
基本上我有一个MainViewController
,它创建PreviewsView
的实例。
在PreviewsView
中,我有委托和dataSource属性:
@property (nonatomic, unsafe_unretained) IBOutlet id<PreviewsDataSource> dataSource;
@property (nonatomic, unsafe_unretained) IBOutlet id<PreviewsDelegate> delegate;
我在
PreviewsView
中创建MainViewController
的实例,将self
设置为delegate
和dataSource
,将其添加以查看并另存为实例变量:- (void)addPreviews {
previewsView = [[PreviewsView alloc] initWithFrame:CGRectMake(0, 75, 1024, 480)];
previewsView.dataSource = self;
previewsView.delegate = self;
[self.view addSubview:previewsView];
}
然后,当我从导航控制器ACR deallocates中删除
MainViewController
时,但previewsView
仍然存在(WHY ???),并实际运行触发[self.delegate doSomeStuff]
的方法。由于MainViewController
已经取消分配-它抛出EXC_BAD_ACCESS
。所以基本上:
MainViewController
的实例拥有PreviewsView
的实例(previewsView)在
MainViewController
中分配为delegate
和dataSource
的PreviewsView
实例在释放
MainViewController
实例后,previewsView仍处于运行状态。任何想法为什么?
谢谢。
最佳答案
您需要像这样释放MainViewController之前将代表设置为nil
PreviewsView.delegate = nil;
PreviewsView.dataSource = nil;
最好在您的MainViewController的dealloc方法中调用此代码->您仍然可以像这样将其与ARC一起使用
- (void) dealloc
{
previewsView.dataSource = nil;
previewsView.delegate = nil;
[super dealloc];
}
您应该记住,协议!您的PreviewsView实例仍处于“活动状态”(通知以相同的方式工作),并尝试将消息发送到您的实例,无论它是死的还是活着的。因此,当实现MainViewController时,也可以使用PreviewsView,但是委托仍然处于“活动状态”。因此,您需要通过将它们设置为nil来取消删除它们;)