Утечка в методе категории NSScanner - PullRequest
0 голосов
/ 17 марта 2010

Я создал метод категории 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 байта), но я бы хотел сделать это правильно, если смогу. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 17 марта 2010

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

Для таких придурков, как я, вот что я сделал:

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

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

0 голосов
/ 17 марта 2010

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

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


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

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

...