освобождение NSMutableArray вызывает ошибку EXC_BAD_ACCESS - PullRequest
2 голосов
/ 16 июля 2011

, поэтому, когда я пытаюсь запустить следующий код, я получаю сообщение об ошибке EXC_BAD_ACCESS.это происходит, когда я пытаюсь выпустить NSMutableArray retrievedAnalysisDataList.массив представляет собой список объектов retrievedAnalysisData.если я пытаюсь либо освободить список данных, либо если я настроил инициализацию с автоматическим выпуском, я получаю тот же результат.Я предполагаю, что это как-то связано с секцией сортировки кода, поскольку у меня нет этой проблемы с retrievedAnalysisIDarray.

if (tempDict != NULL) 
    {
        NSMutableArray *retrievedAnalysisDataList = [[NSMutableArray alloc] init];
        NSMutableArray *retrievedAnalysisIDarray = [[NSMutableArray alloc] init];

        for (id key in tempDict)
        {
            retrievedAnalysisData = [[RetrievedAnalysisData alloc] init];

            retrievedAnalysisData.createDate = [[tempDict objectForKey:key] objectForKey:@"createdate"];
            retrievedAnalysisData.ID = [[tempDict objectForKey:key] objectForKey:@"id"];
            retrievedAnalysisData.mode = [[tempDict objectForKey:key] objectForKey:@"mode"];
            retrievedAnalysisData.name = [[tempDict objectForKey:key] objectForKey:@"name"];
            retrievedAnalysisData.numZones = [[tempDict objectForKey:key] objectForKey:@"numzones"];
            retrievedAnalysisData.srcImg = [[tempDict objectForKey:key] objectForKey:@"srcimg"];
            retrievedAnalysisData.type = [[tempDict objectForKey:key] objectForKey:@"type"];

            //NSLog(@"\n createDate: %@ \n id: %@ \n mode: %@ \n name: %@ \n numzone: %@ \n srcimg: %@ \n type: %@", retrievedAnalysisData.createDate, retrievedAnalysisData.ID, retrievedAnalysisData.mode, retrievedAnalysisData.name, retrievedAnalysisData.numZones, retrievedAnalysisData.srcImg, retrievedAnalysisData.type);

            [retrievedAnalysisDataList addObject:retrievedAnalysisData];
            [retrievedAnalysisData release];
        }

        NSSortDescriptor *sortDescriptor;
        sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"createDate" ascending:YES] autorelease];
        NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
        NSArray *sortedRetrievedAnalysisDataList;
        sortedRetrievedAnalysisDataList = [retrievedAnalysisDataList sortedArrayUsingDescriptors:sortDescriptors];

        int count = [sortedRetrievedAnalysisDataList count];

        for (int i = 0; i < count; i++) {
            retrievedAnalysisData = [[RetrievedAnalysisData alloc] init];
            retrievedAnalysisData = [sortedRetrievedAnalysisDataList objectAtIndex:i];

            [retrievedAnalysisIDarray addObject:retrievedAnalysisData.ID];
            [retrievedAnalysisData release];
        }

        dataCenter.sortedRetrievedAnalysisDataList = sortedRetrievedAnalysisDataList;
        dataCenter.retrievedAnalysisIDarray = retrievedAnalysisIDarray;

        [retrievedAnalysisIDarray release];
        [retrievedAnalysisDataList release];

        dataCenter.isRetrieve = [NSNumber numberWithInt:1];

        [activityIndicator stopAnimating];
        [picker reloadAllComponents];

        picker.hidden = FALSE;
        pickerToolBar.hidden = FALSE;
        toolBar.hidden = TRUE;
        innerCircle.hidden = TRUE;
        outerCircle.hidden = TRUE;
        trackLabel.hidden = TRUE;
        displayGPSLabel.hidden = TRUE;

    }

Ответы [ 2 ]

4 голосов
/ 16 июля 2011

Ваша проблема заключается в этом разделе кода:

        retrievedAnalysisData = [[RetrievedAnalysisData alloc] init];
        retrievedAnalysisData = [sortedRetrievedAnalysisDataList objectAtIndex:i];

        [retrievedAnalysisIDarray addObject:retrievedAnalysisData.ID];
        [retrievedAnalysisData release];

В первой строке выделяется новый RetrievedAnalysisData, но затем вторая отбрасывает его (пропускает) и помещает объект, извлеченный из массива, в переменную retrievedAnalysisData. Вы не являетесь владельцем этого объекта, извлеченного из массива, и не становитесь владельцем, вызывая retain. Таким образом, release в четвертой строке неверно, освобождая объект, который вам не принадлежит.

Затем, когда вы отпускаете NSMutableArray, он пытается освободить объект снова, и вы получаете сбой, потому что объект уже освобожден.

Чтобы исправить это, избавьтесь от бесполезной первой строки, а также избавьтесь от неверного выпуска.

1 голос
/ 16 июля 2011

Не зная управления памятью всех ваших свойств, трудно понять, что именно происходит. Но посмотрите здесь:

    for (int i = 0; i < count; i++) {
        retrievedAnalysisData = [[RetrievedAnalysisData alloc] init];
        retrievedAnalysisData = [sortedRetrievedAnalysisDataList objectAtIndex:i];

        [retrievedAnalysisIDarray addObject:retrievedAnalysisData.ID];
        [retrievedAnalysisData release];
    }

Вы вызываете -release для автоматически освобожденного объекта (retrievedAnalysisData). Попробуйте вместо этого:

    for (int i = 0; i < count; i++) {
        retrievedAnalysisData = [sortedRetrievedAnalysisDataList objectAtIndex:i];

        [retrievedAnalysisIDarray addObject:retrievedAnalysisData.ID];
    }
...