这个委托属性是否被强烈引用?

时间:2015-06-18 14:48:32

标签: ios objective-c automatic-ref-counting weak-references retain-cycle

我的一个名为ArticleViewController的VC有问题。永远不会调用dealloc方法,当视图打开和关闭三次时,有三个VC活着。

我阅读了here(当你在ViewController中有一个保留周期时,很好的来源!)以下内容:

  

如果您使用

someObj.delegate = self;
     

在视图控制器中,检查someObj上的委托属性是weak

@property (nonatomic, weak) id delegate;

我的VC中的一个片段是:

PopViewController *pop=[[PopViewController alloc] initWithNibName:@"PopViewController" bundle:nil];
pop.delegate = self;

所以如果财产薄弱,我会检查PopViewController.h

@property (nonatomic, assign) id <PopViewControllerDelegate> delegate;

由于strong是默认值,并且此处没有明确的weak,这会导致我的保留周期吗?我有点怀疑,因为我在例如头文件中看到同样的事情。 UIPopoverController.h,位于UIKit。

@property (nonatomic, assign) id <UIPopoverControllerDelegate> delegate;

2 个答案:

答案 0 :(得分:1)

您应该将其更改为weakassign是基本类型的默认值,应该由基本类型使用。 id是一个对象,因此它应该是weakstrong - 在这种情况下是weak,因为您不应该增加引用计数器。

你可以在这里阅读更多关于strong / weak / assign的信息,据我所知,有很好的解释:SOF question about ARC

很高兴看到这对你来说很重要,因为很多人甚至在Obj-C中都不那么新,只是“跳过”这个问题并在以后遇到内存问题。

- 编辑 -

也许你内心有任何障碍,你在内部保持强烈的自我参考?任何派遣或任何事情?也许你在另一个控制器上有这个属性,这就是为什么它仍然存在?

答案 1 :(得分:1)

来自Transitioning to ARC Release Notes

assignweak几乎相同,因为它不会增加对象的保留计数,所以它不能成为保留周期的来源

weak的区别在于,当指向对象被释放时,weak指针将nil本身,而assign(或__unsafe_unretained)指针仍将指向free'd内存,导致下次尝试取消引用时崩溃。

tl;博士:您可以保留assign,这不是您的内存问题的根源,但使用weak更安全并且可以减少崩溃(因为消息nil是一个无操作)。