Управление памятью в iOS - я не могу узнать, как освободить память - PullRequest
1 голос
/ 13 января 2012

Я использую iOS 4, и у меня есть некоторые проблемы с управлением памятью, которые я не понимаю. Я постараюсь упростить код:

- (void)viewDidLoad
{
    NSMutableArray *buttonArray = [[NSMutableArray alloc] init];
    for (int i = 0; i < [othercollection count]; i++)
    {
        // Push objects to button array
    }

    self.buttonSliderView = [[ButtonSliderView alloc] initWithButtons:
        buttonArray];
    [buttonArray release];
    [self.view addSubview:self.buttonSliderView];
    [buttonSliderView release];
}

- (void) viewDidAppear 
{
     if ([buttonSliderView.menuButtons count] > 0)
     {
         // ...
     }
}

В ButtonSliderView.m:

- (id)initWithButtons:(NSMutableArray *)buttonArray
{
    self = [super init];
    if (self)
    {
        menuButtons = buttonArray;
    }
 }

У меня ошибка в первой строке viewDidAppear. menuButtons были освобождены. Как я могу это исправить? Какое решение является правильным?

Если я изменю объявление массива кнопок на это:

NSMutableArray* buttonArray = [[[NSMutableArray alloc] init] autorelease];

... и удалите предложение release, оно тоже вылетает. Если я удаляю предложение release и не autorelease, это работает, но есть утечки памяти.

Ответы [ 2 ]

2 голосов
/ 13 января 2012

Проблема в том, что вы опускаете установщик и присваиваете menuButtons свойство напрямую. Попробуйте это:

-(id) initWithButtons:(NSMutableArray*)buttonArray  {
    self = [super init];
    if (self) {
        [self setMenuButtons:buttonArray];
    }
}

Вы не показали, как объявлено свойство menuButtons , но я предполагаю, что это:

@property (nonatomic, retain) NSArray* menuButtons;

Это автоматически сохранит кнопки меню для вас каждый раз, когда вы устанавливаете его с помощью установщика. Если ваша собственность объявлена ​​так:

@property (nonatomic, assign) NSArray* menuButtons;

тогда вам нужно сохранить массив вручную:

-(id) initWithButtons:(NSMutableArray*)buttonArray  {
    self = [super init];
    if (self) {
        menuButtons = [buttonArray retain];
    }
}
1 голос
/ 13 января 2012

ButtonSliderView может все еще использовать этот объект (в отличие от захвата содержимого и освобождения его). Не думайте, что это утечка памяти только по этой причине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...