Вопрос утечки памяти - PullRequest
2 голосов
/ 24 мая 2010

У меня проблема утечки памяти со следующим кодом. Насколько я могу судить, я не понимаю, почему проблема сохраняется, но она все еще не освобождается при вызове. Я обнаружил проблему в инструментах, и следующий код поддерживает классы «карточек» живыми, даже если он их выпустил. Любая помощь приветствуется.

... 
...
-(id)initDeckWithCardsPicked: (NSMutableArray*)cardsPicked andColors:(NSMutableArray*)cardColors
    {
        self = [self init];
        if (self != nil) {
            int count = [cardsPicked count];
            for (int i=0; i<count; i++) {
                int cardNum = [[cardsPicked objectAtIndex:i] integerValue];
                Card * card = [[MemoryCard alloc] initWithSerialNumber:cardNum position: CGPointZero color:[cardColors objectAtIndex:i]];
                [_cards addObject: card];
                [card release];
            }
        }
        return self;    
        }

- (id) init
{
    self = [super init];
    if (self != nil) {
        self.bounds = (CGRect){{0,0},[Card cardSize]};
        self.cornerRadius = 8;
        self.backgroundColor = kAlmostInvisibleWhiteColor;
        self.borderColor = kHighlightColor;
            self.cards = [NSMutableArray array];
        }
          return self;
}
...
...

Ответы [ 2 ]

1 голос
/ 28 мая 2010

Не взирая на остальную часть вашего кода, трудно понять, в чем проблема, но пытались ли вы использовать статический анализатор в xcode? Это может быть неоценимым для обнаружения утечек памяти.

Чтобы использовать его, выберите «Построить и проанализировать» в меню «Построение». Более подробная информация на сайте разработчика Apple.

0 голосов
/ 24 мая 2010

Когда вы добавляете карту в массив _cards NSMutableArray с помощью addObject, ей отправляется сообщение сохранения. Таким образом, пока вы храните _cards в памяти, указатель также будет храниться для каждой из его составляющих. Пока ваш dealloc освобождает массив или вы делаете это где-то еще, вы будете в порядке с тем, что вы опубликовали здесь (при условии, что ваш метод initWithSerialNumber возвращает сохраненный объект).

...