我正在使用此函数来提取子字符串,但它有效,但有两个泄漏:
-(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];
我环顾四周但却什么都没发现......
没有分配或保留,所以我不应该发布它们......可能是什么问题?
我希望我自己解释
谢谢!
答案 0 :(得分:0)
您的初始for
循环可能会引发异常。如果未找到匹配项,-[NSString rangeOfString:]
将返回NSRange对象,其中location字段设置为NSNotFound。在这种情况下,当您将该值插入-substringFromIndex:
时,最终会触发异常。
您不应该使用大写的第一个字母命名变量。这种命名通常保留给类名,使你的代码很难阅读。
您可能希望使用aRange.location + aRange.length
而不是NSMaxRange(aRange)
。它编译成完全相同的东西,但它更具可读性。
最后,你没有内存泄漏。为什么你认为有一个?