2010-07-02 146 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

什麼告訴你這裏有泄漏? – 2010-07-02 17:08:07

+0

如果您想確保子字符串不存在,請使用rstr1.location == NSNotFound'。 – kennytm 2010-07-02 18:59:45

回答

0

您的初始for循環很可能會引發異常。如果找不到匹配項,則-[NSString rangeOfString:]返回位置字段設置爲NSNotFound的NSRange對象。在這種情況下,當您將該值插入-substringFromIndex:時,最終會觸發異常。

您不應該用大寫的第一個字母命名變量。這樣的命名通常是爲類名保留的,並且會讓你的代碼非常混亂。您可能需要使用NSMaxRange(aRange)而不是使用aRange.location + aRange.length。它編譯成完全相同的東西,但它更具可讀性。

最後,你沒有內存泄漏。你爲什麼認爲有一個?