Objective c 转换为圆弧时增加了保留计数
我正在把图书馆换成自动取款机。其中我有一个NSViewController子代,它以通常的方式加载xib:Objective c 转换为圆弧时增加了保留计数,objective-c,macos,automatic-ref-counting,Objective C,Macos,Automatic Ref Counting,我正在把图书馆换成自动取款机。其中我有一个NSViewController子代,它以通常的方式加载xib: - (instancetype)initWithModule: ... { self = [super initWithNibName: @"mynib" bundle: [NSBundle bundleForClass: [self class]]]; if (self != nil) { [self view]; } return self; } 当我在没有
- (instancetype)initWithModule: ...
{
self = [super initWithNibName: @"mynib" bundle: [NSBundle bundleForClass: [self class]]];
if (self != nil) {
[self view];
}
return self;
}
当我在没有ARC的情况下执行此操作时,在调用view(加载nib并连接插座,如您所知)之后,该控制器的保留计数为2。但是,在启用ARC的情况下,这会将保留计数增加到3,这会导致此控制器泄漏,因为计数永远不会返回到0
我更改了所有出口以使用弱引用(NSTextView实例除外,但它们从不显示为顶级对象)。但这似乎没有帮助
更新:它似乎会影响我拥有的每个视图控制器,至少是我检查过的所有视图控制器。因此,这似乎是一个基本问题,与xib内容无关
我如何才能找出导致额外负载保留的原因?绝对保留计数没有意义。您需要找到调用
retain
的所有点(或者在ARC的情况下通过暗示调用)
为此,请使用分配工具并启用引用计数跟踪。这将使您能够访问每一个retain的回溯,并且您可以找到额外的一个
它很可能是对
self
中某个对象所持有的块中的self
的强烈引用。否则,这将是一个强有力的参考循环<代码>自我->其他->自我类似的东西。要找到答案,请使用仪器。你能更具体一点吗?我已经试着分析分配情况,但是这个列表告诉我我在这里什么都用不了。使用泄漏工具。当应用程序运行时,找到泄漏的对象并单击内存地址(第3列)旁边的小圆圈箭头。视图将切换为显示对象的MM历史记录。您可以看到每个保留和释放发生在哪里。由你来决定哪个是额外的。控制器甚至没有出现在泄漏对象的列表中。似乎是一条死胡同。Tbh,我仍然很难理解这部分乐器。太多的噪音让我无法专注于我真正感兴趣的东西。但是,长时间盯着代码看(可能包括使用brain@MikeLischke-Heh——我知道这种感觉。我鼓励你找出分配工具。例如,通过最小化分配率,许多性能问题都得到了解决,这是一个很好的工具。