我正在使用Xcode中的Allocations工具来跟踪正在创建但未发布的对象。我可以看到代码执行时对象数量增加,我可以看到使用调用堆栈创建对象的位置,但我无法分辨对象引用的位置。我认为他们被关押在第三方库中,但开发人员说“不,它必须是你的代码”。我将我的代码中的引用设置为nil,但对象仍然存在。
答案 0 :(得分:1)
我认为不存在一种工具可以告诉您每个引用在任何时间点的位置。在您使用ARC时,根据我的经验,有两种相当常见的方法可以让您自己陷入参考周期和泄漏内存:
示例:强>
self.retainedBlock = ^{
[self doSomething];
};
<强>修正:强>
__weak id weakSelf = self;
self.retainedBlock = ^{
id strongSelf = weakSelf;
[strongSelf doSomething];
};
答案 1 :(得分:-1)
这是一种绝望的策略,但你能做的是:
retain
,autorelease
和release
; 最简单的例子:
- (void)release
{
NSLog(@"%@ : %@", self, [NSThread callStackSymbols]);
[super release];
}
(但是,实际上,在由[NSThread callStackSymbols]
索引的字典中为内存管理调用保留[NSValue valueWithPointer:self]
数组可能会更加智能,然后访问来自lldb或将其写入磁盘;为什么要手动有效地索引数据呢?)
解决ARC的最简单方法可能是编写一个禁用ARC的单个类,该方法可以将日志记忆管理方法调整到您想要跟踪的对象上。