SubstringToIndex内存泄漏

时间:2010-07-02 17:04:43

标签: objective-c memory-leaks substring

我正在使用此函数来提取子字符串,但它有效,但有两个泄漏:

-(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];
我环顾四周但却什么都没发现...... 没有分配或保留,所以我不应该发布它们......可能是什么问题? 我希望我自己解释

谢谢!

1 个答案:

答案 0 :(得分:0)

您的初始for循环可能会引发异常。如果未找到匹配项,-[NSString rangeOfString:]将返回NSRange对象,其中location字段设置为NSNotFound。在这种情况下,当您将该值插入-substringFromIndex:时,最终会触发异常。

您不应该使用大写的第一个字母命名变量。这种命名通常保留给类名,使你的代码很难阅读。

您可能希望使用aRange.location + aRange.length而不是NSMaxRange(aRange)。它编译成完全相同的东西,但它更具可读性。

最后,你没有内存泄漏。为什么你认为有一个?