2009-11-14 5 views
0

Я нахожусь в своем первом опыте разработки iPhone. Я написал базовый код для тестирования класса NSScanner, и теперь я изучал инструмент «Утечки». Кажется, что этот код протекает, когда в подробном стеке я дважды щелкаю мой последний вызов (до материала Apple), инкриминированная строка - это комментарий.Ошибка утечки памяти NSScanner

Может ли кто-нибудь помочь мне понять, почему это происходит? с логической точки зрения результат - это то, что я ожидаю, и я сам не формально ничего не расписываю (за исключением переменной xmlblock, которая является btw autoreleased), поэтому я не ожидал необходимости выпускать что-либо ... где я ' Неправильно? :-)

+(NSSet *)extractXMLSectionsWithTag:(NSString *)tag fromString:(NSString *)source firstOnly:(BOOL)firstOnly 
{ 
if (!source) 
    return nil; 
NSScanner *scanner = [NSScanner scannerWithString:source]; 
NSString *openingToken = [NSString stringWithFormat:@"<%@", tag]; 
NSString *closingToken = [NSString stringWithFormat:@"</%@>", tag]; 
NSMutableSet *sections = [NSMutableSet set]; 
NSCharacterSet *majorChar = [NSCharacterSet characterSetWithCharactersInString:@">"]; 

while (![scanner isAtEnd]) { 
    NSString *xmlBlock = [[[NSString alloc] init] autorelease]; 
    [scanner scanUpToString:openingToken intoString:NULL]; 
    [scanner scanString:openingToken intoString:NULL]; 
    [scanner scanUpToCharactersFromSet:majorChar intoString:NULL]; 
    [scanner scanCharactersFromSet:majorChar intoString:NULL]; 
    [scanner scanUpToString:closingToken intoString:&xmlBlock]; 
    if (![xmlBlock isEqualToString:@""]) { // Leaking line 
     [sections addObject:xmlBlock]; 
     if (firstOnly) { 
      break; 
     } 
    } 
} 
return [sections copy]; 
} 
+0

Кстати, вам не нужно создавать пустую строку для 'scanUpToString: inString:', вы можете просто установить ее на 'nil', и метод изменит ее, если она сканирует текст. Другой потенциально полезной вещью является то, что все эти методы NSScanner возвращают логическое значение на основе того, были ли они успешными или нет. – jtbandes

ответ

1

Я уверен, что утечка вызвана возвращение [секция копировать], из метода, как, что вы должны вернуть autoreleased строки - не сохранило один.

В XCode выберите параметр «Build & Analyze» и посмотрите, что он говорит об этом коде.

+0

Да, это была проблема, большое спасибо, мне было непонятно, что сообщение о копировании создает сохраненный объект (я был обманут, думая, что я не звоню никакому сообщению init, поэтому не было моей обязанности выпускать. но копирование, на самом деле, является создателем, конечно). Я изменил последнюю строку, чтобы «вернуть [[копирование копий] autorelease], и ​​утечка больше не появляется! – Andy

+0

На самом деле вы можете просто вернуть« разделы », так как он уже автореализован. Нет необходимости копировать и затем автоопределять, так как он имеет тот же эффект ... –

+0

Последняя копия была (на мой взгляд), чтобы вернуть неизменную версию, чтобы избежать каких-либо накладных расходов, которые могла бы выполнять измененная версия ... это неправильно или бесполезно? – Andy

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