我编写了一个测试代码来检查如何使用仪器(泄漏)。我已经创建了一个视图应用程序,并在单击按钮时加载了如下所示的新视图.
- (IBAction)btn_clkd:(id)sender {
new_file *new = [[new_file alloc] init];
if (new) {
[self.navigationController pushViewController:new animated:YES];
new = nil;
}
}在new_file ViewDidLoad方法中,我创建了如下所示的漏洞.
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
char *c_mem = (char*) malloc(10000000);
strcpy(c_mem, "TESTING");
// free(c_mem);
}即使我使用ARC,分配的内存也是普通的code,使用后我还没有释放内存,即使我一次又一次地弹出和加载新的视图、工具(泄漏)没有检测到这段代码中的任何漏洞.是什么原因,我检查正确了吗?
谢谢
发布于 2013-08-16 09:00:41
如果您的视图控制器已被解除分配(请验证),最终泄漏将检测到c_mem指针泄漏。
仪器可能不会立即发现这一点--因为它使用了检测泄漏的算法。
该算法基本上是搜索未引用的变量,这些变量看起来像指向堆的指针。如果碰巧有一个任意变量,比如p,它的值恰好是c_mem的值--那么仪器认为指针c_mem仍然是从p引用的--尽管p可能只包含任意数据,而不是引用c_mem。
注意,仪器泄漏检测算法实际上更复杂,并可能发生变化并得到改进。
为了查找漏洞,我总是在循环中运行特殊的代码类单元测试。如果使用的内存没有及时增长,你通常是好的。您还可以使用泄漏的“快照”功能和分配的“标记生成”功能来检查堆的当前状态。
发布于 2013-08-16 06:52:33
当你弹出你的ViewController时,如果没有对它的引用,它就会被所有的变量自动释放。所以你才不会泄密。
看看你的控制器发生了什么,当你弹出它,使用泄漏仪器。你也可以在上面看到一些参考资料。对保留周期的检测也非常方便。
这里是关于如何使用仪器的完整参考。
https://stackoverflow.com/questions/18267329
复制相似问题