2010-03-17 3 views
0

Я создал метод категории NSScanner, который показывает утечку в инструментах.Утечка в методе категории NSScanner


- (BOOL)scanBetweenPrefix:(NSString *)prefix 
       andSuffix:(NSString *)suffix 
       intoString:(NSString **)value 
{ 
    NSCharacterSet *charactersToBeSkipped = [self charactersToBeSkipped]; 
    [self setCharactersToBeSkipped:nil]; 

    BOOL result = NO; 

    // find the prefix; the scanString method below fails if you don't do this 
    if (![self scanUpToString:prefix intoString:nil]) 
    { 
     MY_LOG(@"Prefix %@ is missing.", prefix); 
     return result; 
    } 

    //scan the prefix and discard 
    [self scanString:prefix intoString:nil]; 

    // scan the important part and save it 
    if ([self scanUpToString:suffix intoString:value]) // this line leaks 
    { 
     result = YES; 
    } 
    [self setCharactersToBeSkipped:charactersToBeSkipped]; 
    return result; 
} 

Я полагаю, что я передаю значение методу/из метода, но я не уверен. Это небольшая утечка (32 байта), но я бы хотел сделать это правильно, если смогу. Заранее спасибо.

+0

Как вы назвали этот метод? Как вы подготовили '(NSString **) значение', когда вы его вызвали? – Yuji

+0

Yuji, спасибо за ответ. Я не могу форматировать код в комментарии, так что см. Мой ответ ниже. – jluckyiv

ответ

2

Я нашел ответ. У меня был класс модели, который использовал результат вышеприведенного кода, но забыл освободить свойство в методе dealloc. Я должен был поймать это с помощью инструментов, но я не знал, где искать. Я попал в стек вызовов в расширенной информации, в которой была только часть необходимой мне информации.

Для идиотов, как я, вот что я сделал:

  1. Запустить приложение с инструментами ... Утечки.
  2. В приборах наблюдайте за пропущенными блоками (значок сетки внизу) и включите расширенные детали.
  3. Если у вас несколько просочившихся объектов, щелкните треугольник раскрытия, чтобы вы могли посмотреть на дискретный адрес.
  4. Рядом с адресом будет стрелка детали. Нажмите здесь.
  5. Теперь вы будете смотреть на историю. Он начинается с Malloc и показывает, что вы сохраняете и отпускаете.

Вы должны иметь выпуск для malloc и выпуск для каждого сохранения в истории. Сопоставьте свои удержания и релизы и посмотрите на странную игру. Если вы сомневаетесь, посмотрите на нижнюю часть страницы и тщательно просмотрите все свойства, которые вы, возможно, забыли опубликовать в вашем методе dealloc.

+0

+1 Хорошее описание того, как использовать утечки для начинающих. –

0

ОК, я глуп. Этот метод не течет. Утечка идет дальше моего стека вызовов, но я не могу понять, где. Извините за преждевременное сообщение. Я буду следить за тем, когда я выясню, где настоящая утечка, если я не могу понять, что исправить.

В ответ на комментарий Юдзи, мой метод вызова:


    NSString *title; 
    [fileScanner scanBetweenPrefix:kTitlePrefix 
         andSuffix:kTitleSuffix 
         intoString:&title]; 

ли это & название, это проблема? Я создал его после существующих методов и вызовов NSScanner.

+0

Учитывая, где была выделена утечка памяти, наиболее вероятным объяснением является то, что, однако, вы используете заголовок после этого кода, вы пропускаете эту строку. – smorgan

+0

jluckyiv: Я не вижу ничего плохого ни в методе категории, ни в ее использовании. Посмотрите на историю адреса объекта title в Инструментах, чтобы увидеть, что его сохранила и не удалось его выпустить. –

+0

Питер, спасибо за совет. Я все еще нахожу свой путь к Инструментам. – jluckyiv