Не могу разобраться с тестированием утечки памяти на симуляторе и вообще - PullRequest
0 голосов
/ 23 июля 2011

РЕДАКТИРОВАТЬ: ребята, мой вопрос был об использовании инструментов, чтобы увидеть утечки, и код в качестве примера и дополнительного вопроса, но вы ответили на дополнительный вопрос, а не на главную проблему .... Спасибо за ответы, но мне действительно нужно выяснить, как работать инструменты с симулятором ....

Я изучаю разработку под IOS. В одном из кодов, которые я изучаю, я думаю, что существует огромная утечка памяти, поэтому я попытался научиться пользоваться инструментами. Поскольку я учусь сейчас, я пытаюсь использовать инструменты с симулятором, но все руководства, которые я нашел, предназначены для подключения к устройству и последующего использования инструментов, а не с симулятором. все, что я пробовал, не показывает утечек в инструментах.

Приложение не аварийно завершает работу, потому что я предполагаю, что утечка памяти не такая большая, но когда я добавляю следующий код, происходит сбой, почему, даже если я добавляю релиз каждый раз, все равно происходит сбой .. .. что не так с симулятором? или с кодом? работа с xcode3, а не 4.

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

И снова, приложение вылетает, и симулятор не показывает никаких утечек, даже когда я помещаю «процесс прикрепления» в «Симулятор iPhone».

Ответы [ 4 ]

2 голосов
/ 24 июля 2011
NSString *testLeak = [[NSString alloc] initWithString:@"test1223"];

Проблема в том, что вы на самом деле ничего не выделяете.NSString внутренне достаточно умен, чтобы признать, что приведенному выше выражению не нужно ничего выделять, потому что константа @"test1223" не может ни мутировать, ни когда-либо освобождаться.Таким образом, он просто возвращает эту строку.

Если бы вы набрали NSLog(@"%p", testLeak);, вы бы видели один и тот же адрес снова и снова.

Измените NSString на NSMutableString и вы 'Скорее всего, вы увидите тысячи копий.Может быть;NSMutableString можно оптимизировать , чтобы просто указывать на неизменяемую копию до тех пор, пока не будет выполнена операция мутации (подробности реализации).Или вы можете выделить экземпляр некоторого класса вашего собственного творения.

Имейте в виду, что Утечки не обязательно показывают вам все утечки;это не может из-за того, как это работает.

Для этого вида анализа Анализ снимков кучи очень эффективен.

Если происходит сбой, как описано, пожалуйста (а) опубликуйте журнал сбоев и (б) сообщите об ошибке в ваше приложение (созданное для симулятора), прикрепленное к http://bugreport.apple.com/.

В общем Instruments + Simulatorне будет ужасно полезным;Симулятор является лишь приблизительным показателем того, что работает на устройстве.

1 голос
/ 24 июля 2011

Может случиться так, что некоторые вещи получают autorelease'd, и это использует тонну кучи. Попробуйте изменить свой код на это:

for (int i = 0; i < 1000000; i++) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSString *testLeak = [[NSString alloc] initWithString:@"test1223"];
    NSLog(@"%@",testLeak);
    [testLeak release];
    [pool drain];
}
1 голос
/ 23 июля 2011

[что-то выпустить] на самом деле не освобождает память в тот момент, когда она вызывается, а просто уменьшает счетчик ссылок на объект. Если счетчик равен 0, вызывается [что-то dealloc] , и это освобождает память. Я предполагаю, что вы выделяете память быстрее, чем система может ее освободить ... кроме того, выполнение 1.000.000 выделений в быстрой последовательности вместо одного огромного, вероятно, настолько же плохая практика кодирования, как и они ...

0 голосов
/ 24 июля 2011

Спасибо всем, я действительно нашел ответ около 4 часов утра ... когда вы хотите проверить утечки на эмуляторе:

ром -> запустить с помощью Performance Tool -> Leaks

Если вы выберете симулятор в правом верхнем углу в качестве устройства для запуска приложения, он запустит симулятор и инструменты и запустит регистратор утечек, все в один клик ....

Получайте удовольствие:-) Эрез

...