我对ARC有问题。经过几个小时的调试,我放弃了,并决定在此处进行检查。

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

PreviewsView中,我有委托和dataSource属性:

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


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

- (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中分配为delegatedataSourcePreviewsView实例
在释放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来取消删除它们;)

10-07 17:02