我正在将图书馆转换为ARC atm。我有一个NSViewController后代,以通常的方式加载xib:
- (instancetype)initWithModule: ...
{
self = [super initWithNibName: @"mynib" bundle: [NSBundle bundleForClass: [self class]]];
if (self != nil) {
[self view];
}
return self;
}
当我在没有ARC的情况下执行此操作时,在调用视图之后该控制器的保留计数为2(如您所知,它会加载笔尖并连接插座)。但是,如果启用ARC,则会将保留计数增加到3,这会导致此控制器泄漏,因为计数永远不会返回到0。
我更改了所有出口以使用弱引用(NSTextView实例除外,但它们从不作为顶级对象出现)。但这似乎没有帮助。
更新:这似乎会影响我拥有的每个视图控制器,至少我检查过的所有视图控制器。所以这似乎是一个基本问题,与xib内容无关。
如何找出导致额外保留的原因?
答案 0 :(得分:2)
绝对保留计数毫无意义。您需要找到调用retain
的所有位置(或者在ARC的情况下通过暗示调用)。
为此,请使用“分配”工具并启用引用计数跟踪。这将使您可以访问每个保留的回溯,您可以找到额外的保留。
更有可能的是,self
中某些内容中self
的强引用。或者它将是一个强有力的参考周期; self -> other -> self
有点儿。