Утечки памяти при использовании NSMutableArray - PullRequest
0 голосов
/ 26 августа 2011

Привет, ребята, может кто-нибудь, пожалуйста, посоветуйте, как излечить утечки памяти в коде ниже

Я пробовал практически каждую комбинацию релиза и автоматического выпуска, о которой я могу думать, но каждый раз, когда происходит сбой приложения илиостается утечка

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{

//get refereance to the textfield
UITextField *currentTextField = (UITextField*)[self.view viewWithTag:200];

//check which picker
if(pickerView.tag ==1)
{   
    // Only calls the following code if component "0" has changed.
    if (component == 0) {

        // Sets the global integer "component0Row" to the currently selected row of component "0"
        component0Row  = row;

        // Loads the new values for the selector into a new array in order to reload the data.
    newValues = [[NSMutableArray alloc] initWithArray:[pickerData objectForKey:[selectorKeys objectAtIndex:component0Row]]];
        currentValues = newValues;


        // Reloads the data of component "1".
        [pickerView reloadComponent:1];


    }

    //run the selector logic
    [self textFieldDidEndEditing:currentTextField];

}

надеюсь, кто-то может посоветовать

большое спасибо

Ответы [ 3 ]

2 голосов
/ 26 августа 2011

Ваша проблема в этих двух строках:

newValues = [[NSMutableArray alloc] initWithArray:[pickerData objectForKey:[selectorKeys objectAtIndex:component0Row]]];
currentValues = newValues;

В первой строке выделен новый экземпляр NSMutableArray.Вторая строка копирует указатель из newValues в currentValues, , перезаписывая значение указателя в currentValues.Все, на что указывал currentValues, потеряно.Это утечка.

Вы можете исправить это так:

newValues = [[NSMutableArray alloc] init...
[currentValues release];
currentValues = newValues;

Таким образом, все, на что указывал currentValues, уменьшит счетчик ссылок, прежде чем потерять к нему доступ.

Эту проблему также можно решить, если сделать currentValues ​​свойством Objective-C и использовать методы доступа через self.currentValues или [self setCurrentValues:];эти методы будут обрабатывать сохранение / освобождение для вас.

0 голосов
/ 26 августа 2011

Не знаю, как вы определили currentValues, но это должно работать без утечек:

В вашем файле .h:

@property (nonatomic, retain) NSArray * currentValues;

В вашем файле .m:

@synthesize currentValues;

self.currentValues = newValues;
0 голосов
/ 26 августа 2011

Ваше распределение NSMutableArray никогда не освобождается.

newValues = [[NSMutableArray alloc] initWithArray:[pickerData objectForKey:[selectorKeys objectAtIndex:component0Row]]];

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

...