2011-04-05 70 views
0

我有这个功能的内存泄漏问题。我认为用componentsSeparatedByString创建一个NSArray是autorelease,但仪器似乎表明在NSArray aPair泄漏。为什么它会在那里显示泄漏,而不是以同样的方式创建其他NSArrays?NSArray与componentsSeparatedByString内存泄漏

-(void) checkRequest: (NSString *)request view:(UIViewController *)theView webView:(UIWebView *)wView 
{ 
    //NSLog(@"JSResponder - checkRequest()"); 

    NSString *aRequest = [NSString stringWithString:request]; 

    NSArray *urlArray = [aRequest componentsSeparatedByString:@"?"]; 

    if([urlArray count] > 1) 
    { 
     NSString *paramsString = [urlArray lastObject]; 
     NSString *cmd = @""; 

     NSArray *urlParamsArray = [paramsString componentsSeparatedByString:@"&"]; 
     int numCommands = [urlParamsArray count]; 

     NSMutableDictionary *paramsWithNames = [[NSMutableDictionary alloc ]      initWithCapacity:numCommands]; 

     for (NSString *elementPair in urlParamsArray) 
     { 
      NSArray *aPair = [elementPair componentsSeparatedByString:@"="]; 

      NSString *aKey = [aPair objectAtIndex:0]; 
      NSString *aParam = [aPair objectAtIndex:1]; 

      if([aKey compare:@"_command"] == NSOrderedSame) 
      { 
       cmd = aParam; 
      } 
      else 
      { 
       [paramsWithNames setValue: aParam forKey:aKey]; 
      } 
     } 

     [self executeCommand: cmd withParams: paramsWithNames view:theView webView:wView]; 

     [paramsWithNames release]; 
    } 
} 

这个函数被调用由以下:

- (void)pullJSEvent:(NSTimer*)theTimer 
{ 
    NSLog(@"MainView - pullJSEvent()"); 

    NSString *jsCall = [NSString stringWithString:@"if(typeof checkOBJCEvents == 'function'){checkOBJCEvents();}"]; 

    NSString *jsAnswer = [[webView stringByEvaluatingJavaScriptFromString:jsCall] retain]; 

    if([jsAnswer compare:@"none"] != NSOrderedSame) 
    { 
     //NSLog(@"   answer => %@", jsAnswer); 
     [jsResponder checkRequest:jsAnswer view:(UIViewController *)self webView:self.webView]; 
    } 
    [jsAnswer release]; 
} 

感谢信

回答

2

你将不得不挖一个深一点与泄漏的仪器。你正在泄漏数组中的一个字符串,而不是数组本身。泄漏表示该行,因为这是数组中字符串的分配位置。

进入泄漏,查看泄漏的实例,然后单击该小箭头按钮。你会看到泄漏对象的所有保留和释放,这应该指出你的问题。

Leaks