编辑:伙计们,我的问题是关于使用工具查看泄漏,以及代码作为示例和附带问题,但您回答了问题而不是主要问题....谢谢你答案,但我真的需要找出如何使用模拟器工作......
我正在学习IOS开发,在我正在研究的一个代码中,我认为存在巨大的内存泄漏,所以我尝试学习如何使用仪器。正如我现在正在学习的那样,我正在尝试使用带有模拟器的仪器,但我找到的所有手册都是用于连接设备然后使用仪器而不是模拟器。我尝试的每一件事都没有显示仪器的任何泄漏。
该应用程序不会崩溃,因为我猜测内存泄漏不是那么大,但是当我添加以下代码时它会崩溃,为什么会这样,即使我每次都添加了该版本,仍然会崩溃.. ..模拟器有什么问题?还是用代码?使用xcode3而不是4。
for (int i = 0; i < 1000000; i++) {
NSString *testLeak = [[NSString alloc] initWithString:@"test1223"];
NSLog(@"%@",testLeak);
[testLeak release];
}
同样,应用程序崩溃并且模拟器没有显示任何泄漏,即使我将“附加过程”放在“iPhone模拟器”上。
答案 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如果您选择右上角的模拟器作为运行应用程序的设备,它将启动模拟器和仪器并启动泄漏记录仪,只需点击一下即可....
玩得开心:-) 埃雷兹