2010-07-02 3 views
1

Я использую эту функцию, чтобы извлечь подстроку, он работает, но есть две утечек:SubstringToIndex утечки памяти

-(NSString*)EstraiP:(NSString*)str ini:(NSString*)ini fin:(NSString*)fin occ:(int)occ{ 

    NSRange rstr1; 
    for(int i=0; i < occ; i++){ 
      rstr1=[str rangeOfString:fin]; 
      str=[str substringFromIndex:rstr1.location+rstr1.length]; 
    } 

    NSString* FinalStr; 
    rstr1=[str rangeOfString:ini]; 

    if(occ==0){ 
      if(rstr1.length==0) 
       return @"Non Trovato inizio"; 
      FinalStr=[str substringFromIndex:(rstr1.location + rstr1.length)] ; 
    }else{ 
      if(rstr1.length==0) 
       return @"Non Trovato inizio"; 
      FinalStr=[str substringFromIndex:rstr1.location+rstr1.length] ; 
    } 

    NSRange rstr2=[FinalStr rangeOfString:fin]; 
    if(rstr2.length==0) 
      return @"Non Trovata fine"; 
    FinalStr=[FinalStr substringToIndex:rstr2.location]; 

    return FinalStr; 
} 

Это к линиям произойти утечку часть памяти:

str=[str substringFromIndex:rstr1.location+rstr1.length]; 

FinalStr=[FinalStr substringToIndex:rstr2.location]; 

я посмотрел вокруг, но ничего не нашел .... Нет никакого выделения или сохранения, поэтому я не должен их выпускать ... что может быть проблемой? Надеюсь, я сам объяснил

Спасибо!

+2

Что вам сказал, что здесь есть утечки? –

+0

Если вы хотите, чтобы подстрока не существовала, используйте 'rstr1.location == NSNotFound'. – kennytm

ответ

0

Ваш начальный цикл for может вызвать исключение. -[NSString rangeOfString:] возвращает объект NSRange с полем местоположения, установленным в NSNotFound, если совпадение не найдено. В этом случае вы в конечном итоге инициируете исключение при подключении этого значения к -substringFromIndex:.

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

Вместо использования aRange.location + aRange.length вы можете использовать NSMaxRange(aRange). Он компилируется точно так же, но это немного читаемо.

И, наконец, у вас нет утечек памяти. Почему, по-вашему, есть один?

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