2010-11-28 4 views
0

я следующий код:- [NSString componentsSeparatedByString:] утечка

NSString *indexText = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
if (indexText==nil) { 
    [indexText release]; 
    indexText = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
} 
[data release]; 
NSAutoreleasePool *innerPool = [NSAutoreleasePool new]; 
NSArray *packageList = [indexText componentsSeparatedByString:@"\n\n"]; //if commented out, there's no leak 
[indexText release]; 
[innerPool drain]; 

Я выполняя componentsSeparatedByString: на indexText, но я просачиваться совсем немного памяти, несмотря на тот факт, что packageList является autoreleased (доказано по тому, что код сработает, если я попытаюсь его снова выпустить). Когда я прокомментирую строку с componentsSeparatedByString:, утечка исчезнет.

Кстати, я просматриваю использование памяти в Activity Monitor во время работы iPhone Simulator; Инструменты не обнаруживают утечку. Является ли утечка просто иллюзией, особенностью симулятора?

+1

Кстати (не связанный с вопросом): if (indexText == nil) [indexText release] не имеет никакого смысла. Если инициализатор возвращает nil, он освободит объект - вам не нужно ничего отпускать. И действительно, вы не могли даже отправить это сообщение, потому что вы не получили указатель на объект, который хотите выпустить, так как он равен нулю (0x0). – 2010-11-28 12:54:52

+0

Хорошо, это имеет смысл. Я думал, что, поскольку я вызывал `[NSString alloc]`, мне пришлось бы освободить его; спасибо за это. – denizen 2010-11-28 19:23:50

ответ

7

Невозможно, чтобы память действительно просочилась, componentsSeperatedByString: возвращает autoreleased NSArray.

Целевые инструменты, когда дело доходит до этих вещей.

Смежные вопросы