0

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

谢谢

4

2 回答 2

1

鉴于您的视图控制器已被释放(请验证),最终Leaks 将检测到该c_mem指针泄漏。

仪器可能不会立即发现这一点- 由于它用于检测泄漏的算法。

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

请注意,Instruments 泄漏检测算法实际上更复杂,并且可能会发生变化和改进。

为了发现漏洞,我总是在循环中运行特殊代码——比如单元测试。如果使用的内存没有及时增长,你通常是好的。您还可以使用 Leaks 的“快照”功能和分配的“标记生成”功能来检查堆的当前状态。

于 2013-08-16T09:00:41.370 回答
0

当你弹出你的ViewController,如果没有任何引用它,它会被 ARC 自动释放它的所有变量。这就是为什么您不会泄漏。

看看你的控制器发生了什么,当你弹出它时,使用泄漏仪器。您还可以在上面看到许多参考资料。检测保留周期也非常方便。

是有关如何使用 Instruments 的完整参考。

于 2013-08-16T06:52:33.213 回答