使用仪器检测C泄漏(泄漏)

时间:2013-08-16 06:44:55

标签: iphone ios xcode malloc instruments

我写了一个测试代码来检查如何使用Instrument(Leaks)。我创建了一个单一的视图应用程序,点击按钮后我加载了一个像这样的新视图...

- (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,分配的内存也是一个简单的C malloc,并且在使用后我没有释放内存,即使我已经一次又一次地弹出并加载新视图,仪器(Leaks)没有检测到任何泄漏在这段代码中...原因是什么,我正确检查了吗?

感谢名单

2 个答案:

答案 0 :(得分:1)

鉴于您的视图控制器已取消分配(请验证),最终泄漏将检测到c_mem指针泄漏。

由于用于检测泄漏的算法,仪器可能无法立即找到

该算法基本上是搜索未引用的变量,看起来像指向堆的指针。如果发生有一个任意变量,比如 p ,其值恰好是c_mem的值 - 那么Instruments 认为指针c_mem仍然从 p 引用 - 即使 p 可能只包含任意数据而不引用c_mem

请注意,仪器泄漏检测算法实际上更复杂,可能会改变并得到改进。

为了找到泄漏,我总是在循环中运行特殊代码 - 比如单元测试。如果使用的内存没有及时增长,通常你会很好。您还可以使用Leaks的“Snapshot”功能和Allocations的“Mark Generation”功能来检查堆的当前状态。

答案 1 :(得分:0)

当您弹出ViewController时,如果没有任何引用它,ARC将自动解除分配所有变量。这就是为什么你不会泄漏。

使用“泄漏仪器”查看控制器弹出时的情况。你也可以在那里看到很多参考文献。检测保留周期也非常方便。

Here是关于如何使用乐器的完整参考。