Утечки памяти при использовании NSmutableArray

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

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

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

}

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

огромное спасибо


person superllanboy    schedule 26.08.2011    source источник


Ответы (3)


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

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:]; эти методы будут обрабатывать сохранение/освобождение для вас.

person benzado    schedule 26.08.2011
comment
Привет, Бенсадо, спасибо за ваши предложения, но я устал от этого выпуска раньше, и только сейчас снова, и приложение вылетает с ошибкой доступа, когда я прокручиваю средство выбора, это сводит меня с ума в данный момент. - person superllanboy; 26.08.2011
comment
Вы спрашивали про утечку. Эти ответы закроют вашу утечку. Авария — еще одна проблема. Найдите инструкции в Google и поставьте точку останова на objc_exception_throw, чтобы вы могли узнать, что такое плохой указатель. Затем задайте новый вопрос, если вы не можете понять это. - person benzado; 26.08.2011
comment
сбой произойдет, если я приму предложенный вами код для устранения утечки. Вероятно ли, что заткнутая утечка может вызвать сбой в другой части кода? Я действительно не понимаю этого, поэтому надеюсь, что вы уточните и объясните, спасибо - person superllanboy; 26.08.2011

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

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

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

person Community    schedule 26.08.2011
comment
Привет, Алекс, я уже пробовал авторелиз, но приложение вылетает, у меня есть релиз в делелоке, но это не мешает инструментам обнаруживать утечку после - person superllanboy; 26.08.2011

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

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

@property (nonatomic, retain) NSArray * currentValues;

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

@synthesize currentValues;

self.currentValues = newValues;
person Perception    schedule 26.08.2011
comment
Привет восприятие currentValues ​​выделяется в viewdidload следующим образом currentValues ​​= [[NSMutableArray alloc] initWithArray: [pickerData objectForKey: [selectorKeys objectAtIndex:component0Row]]]; - person superllanboy; 26.08.2011
comment
@superllanboy - currentValues является свойством вашего представления или просто переменной, которую вы объявляете в функции? Если второе, то вы нашли утечку. - person Perception; 26.08.2011
comment
привет восприятие currentvalues ​​является свойством - person superllanboy; 28.08.2011
comment
Хорошо, тогда ваша утечка, скорее всего, происходит, потому что вы используете текущие значения в качестве ивара (каждый раз, когда вы заменяете его значение, вы теряете старый объект, который был на его месте). Вместо того, чтобы делать currentValue = someobj, делайте self.currentValue = someobj. - person Perception; 28.08.2011