NSArray с компонентамиSeparatedByString утечка памяти - PullRequest
0 голосов
/ 05 апреля 2011

У меня проблемы с утечкой памяти при использовании этой функции. Я думал, что создание NSArray с componentSeparatedByString было автоматическим выпуском, но инструменты, кажется, указывают на утечку в NSArray aPair. Почему это указывает на утечку там, а не на других NSArrays, созданных таким же образом?

-(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 Ответ

2 голосов
/ 22 июля 2011

Вам придется копать немного глубже с инструментом Leaks.Вы пропускаете одну из строк в массиве, а не сам массив.Утечки указывают на эту строку, потому что именно там расположены строки в массиве.

Войдите в Leaks, посмотрите на протекший экземпляр и нажмите эту маленькую кнопку со стрелкой.Вы увидите все удержания и выпуски утекшего объекта, которые должны указать вам на проблему.

Leaks

...