4

我在 Xcode 中使用 Allocations 工具来跟踪正在创建但未释放的对象。随着代码的执行,我可以看到对象计数增加,并且我可以看到使用调用堆栈创建对象的位置,但我无法确定对象引用的保存位置。我认为它们被保存在第 3 方库中,但开发人员说“不,它必须是你的代码”。我将代码中的引用设置为零,但对象仍然存在。

4

2 回答 2

1

我认为不存在可以告诉您每个参考在任何时间点的位置的工具。当您使用 ARC 时,根据我的经验,有两种相当常见的方法可以让自己陷入引用循环并泄漏内存:

  1. 类 A 对类 B 的实例具有强引用,而类 B 对类 A 的同一实例具有强引用。
  2. 块隐式保留对其捕获的对象的引用。所以一个明显的问题是当你的对象保留一个保留对自身的引用的块时。

例子:

self.retainedBlock = ^{
    [self doSomething];
};

使固定:

__weak id weakSelf = self;
self.retainedBlock = ^{
    id strongSelf = weakSelf;
    [strongSelf doSomething];
};
于 2013-11-17T11:45:07.123 回答
-1

这是一个绝望的策略,但你可以做的是:

  1. 为受影响的对象禁用 ARC(或解决它;见下文);
  2. 添加日志记录retainautoreleaserelease
  3. 通过日志跟踪已知的过度保留对象。

最简单的例子:

- (void)release
{
    NSLog(@"%@ : %@", self, [NSThread callStackSymbols]);
    [super release];
}

[NSThread callStackSymbols](尽管在实践中,将内存管理调用的数组保留在由 eg 索引的字典中[NSValue valueWithPointer:self],然后从 lldb 或通过将其写入磁盘来访问它可能要聪明得多;为什么还要手动有效地索引数据?)

解决 ARC 的最简单方法可能是编写一个禁用 ARC 的单个类,该类可以将您的日志记录内存管理方法调配到您要跟踪的对象上。

于 2014-08-22T22:48:58.843 回答