2011-07-14 13 views
2

Xコードのリークツールを使用してプログラムを実行すると、この関数がメモリリークの主な原因であることを示します。SubstringWithRangeでのメモリリークNSString

+ (NSMutableArray *) getColumns:(NSString *) deviceHtml { 

     NSMutableArray *ret = [[[NSMutableArray alloc] init] autorelease]; 
     NSRegularExpression *m = [[NSRegularExpression alloc] initWithPattern:@"<td[\\w\\W\\d\\s</>]*?>[\\w\\W\\d\\s]+?</td>" options:NSRegularExpressionCaseInsensitive error:nil]; 

     NSArray *results = [m matchesInString:deviceHtml options:NSMatchingCompleted range:NSMakeRange(0, [deviceHtml length])]; 
     [m release]; 

     for (NSTextCheckingResult * res in results) { 
      NSString *cleaned = [deviceHtml substringWithRange:[res range]]; 
      int firstClose = [cleaned rangeOfString:@">"].location; 
      int cleanedLength = [cleaned length]; 
      NSString *cleaned1 = [cleaned substringWithRange:NSMakeRange(firstClose+1, cleanedLength-(firstClose+1))]; 
      int closingComment = [cleaned1 rangeOfString:@"</td"].location; 
      NSString *cleaned2 = [cleaned1 substringWithRange:NSMakeRange(0, closingComment)]; 
      NSString *cleaned3 = [cleaned2 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
      [ret addObject:cleaned3]; 
     } 
     return ret; 
    } 

具体的に、このライン、

NSString *cleaned2 = [cleaned1 substringWithRange:NSMakeRange(0, closingComment)]; 

私は誰もが私にいくつかのポインタを与えることができますので、私は少しこだわっているNSCFStringsと便利なメソッドとメモリ管理については本当にわからないんだけど?

おかげ

+3

明らかにコードに間違いはありません。あなたは確かに、関数がメモリリークを引き起こす(割り振りピークの代わりに)? 'for'ループにローカルNSAutoreleasePoolを使用しようとしましたか? – Dirk

答えて

2

まず、この方法は、たとえば、columnsForDevice:のようなものgetColumns:ことはなくてはなりません。接頭辞としてget*はココアで非常に特殊な意味を持ちますが、これはそうではありません。

第二に、リーク機器は漏れが実際にが起きできる場所漏れが、ないを割り当てられたかを示して。

返された配列が他の場所で過剰に保持されていると、それが漏れの原因になります。

関連する問題