我的一个名为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;
答案 0 :(得分:1)
您应该将其更改为weak
。 assign
是基本类型的默认值,应该由基本类型使用。 id
是一个对象,因此它应该是weak
或strong
- 在这种情况下是weak
,因为您不应该增加引用计数器。
你可以在这里阅读更多关于strong
/ weak
/ assign
的信息,据我所知,有很好的解释:SOF question about ARC。
很高兴看到这对你来说很重要,因为很多人甚至在Obj-C中都不那么新,只是“跳过”这个问题并在以后遇到内存问题。
- 编辑 -
也许你内心有任何障碍,你在内部保持强烈的自我参考?任何派遣或任何事情?也许你在另一个控制器上有这个属性,这就是为什么它仍然存在?
答案 1 :(得分:1)
来自Transitioning to ARC Release Notes:
assign
与weak
几乎相同,因为它不会增加对象的保留计数,所以它不能成为保留周期的来源
与weak
的区别在于,当指向对象被释放时,weak
指针将nil
本身,而assign
(或__unsafe_unretained
)指针仍将指向free'd内存,导致下次尝试取消引用时崩溃。
tl;博士:您可以保留assign
,这不是您的内存问题的根源,但使用weak
更安全并且可以减少崩溃(因为消息nil
是一个无操作)。