NSArray 与 componentsSeparatedByString 内存泄漏

Posted

技术标签:

【中文标题】NSArray 与 componentsSeparatedByString 内存泄漏【英文标题】:NSArray with componentsSeparatedByString memory leak 【发布时间】:2011-04-05 12:45:38 【问题描述】:

我在使用此函数时遇到内存泄漏问题。我认为使用 componentsSeparatedByString 创建一个 NSArray 是自动释放,但仪器似乎表明 NSArray aPair 存在泄漏。为什么它会表明那里有泄漏,而不是在以相同方式创建的其他 NSArray 处?

-(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];

谢谢

【问题讨论】:

【参考方案1】:

您将不得不使用 Leaks 工具进行更深入的挖掘。您正在泄漏数组中的一个字符串,而不是数组本身。泄漏指示该行,因为这是分配数组中的字符串的位置。

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

【讨论】:

以上是关于NSArray 与 componentsSeparatedByString 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

OBC: NSString 与 NSArray 互转

NSArray与NSMutableArray的常用方法

如何将 NSArray 和 NSArrayController 与 Core Data 一起使用?

NSArray 与字符串

NSArray 与 componentsSeparatedByString 内存泄漏

NSArray 与 C 类型?