0

我有ARC问题。经过几个小时的调试,我放弃了,并决定在这里检查。ARC不会发布实例变量

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

PreviewsView我有代表且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]; 
} 

然后,当我从导航控制器中删除MainViewController ACR解除分配时,BUT previewsView仍然存在(W HY ???)并且实际运行触发[self.delegate doSomeStuff]的方法。由于MainViewController已经释放 - 它会抛出EXC_BAD_ACCESS

所以基本上:

  • MainViewController实例拥有的PreviewsView实例(previewsView)的MainViewController
  • 比如在PreviewsView
  • 指定为delegatedataSourceMainViewController释放实例之后,previewsView仍然活着,运行。

任何想法为什么? 谢谢。

+1

是否有意创建一个名为'previewsView'的视图(在'addPreviews'方法中),但添加完全不同的子视图('previewsCaroucel')? – omz 2012-04-26 15:10:10

+0

对不起,这是因为在发布之前重命名变量 – OgreSwamp 2012-04-26 15:14:43

回答

1

unsafe_unretained不是零伊娃。 __weak确实。

MainViewController成员previewsView是否保留它?在viewDidUnload中或在完成previewsView之后,将其设置为零,即:previewsView = nil

通常所有IBOutlets或子视图都是ivars应该是__weak。如果在将其添加为子视图后不需要previewsView,则可以删除ivar。

希望这会有所帮助!

+0

AFAIK'weak'在iOS 4.x中不可用,所以这对我来说不是解决方案。 – OgreSwamp 2012-04-26 15:07:51

+1

在那个原因中,你必须显式地删除你的成员,或者不保留它。 – 2012-04-26 15:08:33

+0

在这种情况下,nil将如何帮助? Nil不会发布预览视图,previewsView仍然会引用已发布的MainViewController。 – OgreSwamp 2012-04-26 15:11:34

2

您需要将您的代表设置为零,然后才能释放MainViewController,如 previewsView.delegate = nil; previewsView.dataSource = nil;

优选的调用这段代码在你的dealloc方法MainViewController - >你仍然可以使用ARC也使用这样的

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

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