无法用模拟器和一般的方法来计算内存泄漏测试

时间:2011-07-23 11:56:05

标签: ios xcode ios-4.2 xcode3.2 ios4

编辑:伙计们,我的问题是关于使用工具查看泄漏,以及代码作为示例和附带问题,但您回答了问题而不是主要问题....谢谢你答案,但我真的需要找出如何使用模拟器工作......

我正在学习IOS开发,在我正在研究的一个代码中,我认为存在巨大的内存泄漏,所以我尝试学习如何使用仪器。正如我现在正在学习的那样,我正在尝试使用带有模拟器的仪器,但我找到的所有手册都是用于连接设备然后使用仪器而不是模拟器。我尝试的每一件事都没有显示仪器的任何泄漏。

该应用程序不会崩溃,因为我猜测内存泄漏不是那么大,但是当我添加以下代码时它会崩溃,为什么会这样,即使我每次都添加了该版本,仍然会崩溃.. ..模拟器有什么问题?还是用代码?使用xcode3而不是4。

for (int i = 0; i < 1000000; i++) {
    NSString *testLeak = [[NSString alloc] initWithString:@"test1223"];
    NSLog(@"%@",testLeak);
    [testLeak release];
}

同样,应用程序崩溃并且模拟器没有显示任何泄漏,即使我将“附加过程”放在“iPhone模拟器”上。

4 个答案:

答案 0 :(得分:2)

NSString *testLeak = [[NSString alloc] initWithString:@"test1223"];

问题是你实际上并没有分配任何东西。 NSString内部足够聪明,可以识别上面的表达式不需要分配任何东西,因为常量字符串@"test1223"既不能变异也不能被释放。因此,它只返回该字符串。

如果你NSLog(@"%p", testLeak);,你会一遍又一遍地看到相同的地址。

NSString更改为NSMutableString,您可能会看到数千份副本。也许; NSMutableString 可以进行优化,只指向不可变副本,直到执行变异操作(实现细节)。或者你可以分配你自己创作的某个类的实例。

请记住,泄漏并不一定会显示所有泄漏;它不能因为它的工作方式。

对于这种分析,Heapshot analysis非常有效。


如果按照描述崩溃,请(a)发布崩溃日志,并(b)提交附加到http://bugreport.apple.com/的应用程序(为模拟器构建)的错误。

通常,仪器+模拟器不会非常有用;模拟器只是设备上运行的近似值。

答案 1 :(得分:1)

[something release] 实际上并不会在调用它的瞬间释放内存 - 它只会减少对象的引用计数。如果计数为0,则调用 [some dealloc] ,释放内存。我猜你的内存分配速度比系统可以释放它的速度快...而且,快速连续执行1.000.000分配而不是单个巨大的分配可能与编码实践一样糟糕......

答案 2 :(得分:1)

可能有些东西正在自动释放,而且正在使用大量的堆。尝试将代码更改为:

for (int i = 0; i < 1000000; i++) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSString *testLeak = [[NSString alloc] initWithString:@"test1223"];
    NSLog(@"%@",testLeak);
    [testLeak release];
    [pool drain];
}

答案 3 :(得分:0)

谢谢大家,我确实在凌晨4点左右找到了答案... 当你想在模拟器上测试泄漏时:

朗姆酒 - &gt;使用Performance Tool运行 - &gt; Leaks

如果您选择右上角的模拟器作为运行应用程序的设备,它将启动模拟器和仪器并启动泄漏记录仪,只需点击一下即可....

玩得开心:-) 埃雷兹