Instruments говорит, что у меня утечка памяти, но я ее не вижу - PullRequest
2 голосов
/ 09 июля 2010

У меня есть метод для создания объекта Deck (подкласс NSObject со свойством NSMutableArray), и он заполняет массив объектами Card (подкласс UIView с некоторым целым числом и одним свойством NSString).Когда я запрашиваю колоду, я проверяю, существует ли она (я думаю), и если да, то освобождаю ее, прежде чем получить новую.

Код из моего viewcontroller ...

#import "FlashTestViewController.h"

@implementation FlashTestViewController

- (IBAction)generateDeck {

    if (aDeck != nil) {
        [aDeck release];
    }

    aDeck = [[Deck alloc] initDeckWithOperator:@"+"];
}


- (IBAction)generateCard {

    if (aCard != nil) {
        [aCard fadeAway];
    }

    aCard = [aDeck newCardFromDeck];
    [self.view addSubview:aCard];
}

- (void)fadeAway {
    [aCard removeFromSuperview];
    [aCard release];
    }

    @end

Класс Deck выглядит следующим образом ...

#import <Foundation/Foundation.h>
#import "Card.h"

@class Deck;

@interface Deck : NSObject {

    NSMutableArray* cards;
}

@property(nonatomic, retain) NSMutableArray* cards;

- (id)initDeckWithOperator: (NSString*)mathOper;
- (id)newCardFromDeck;

@end

- (id)initDeckWithOperator: (NSString*)mathOper {

    if (cards != nil) {
        [cards release];
    }
    cards = [[NSMutableArray alloc] init];
    for (int i=0; i<11; i++) {
        for (int j=0; j<11; j++) {
            int xPos = (random() % 220) + 10;
            int yPos = (random() % 360) + 10;
            Card* aCard = [[Card alloc] initWithFrame:CGRectMake(xPos, yPos, 60, 80)];
            aCard.upperOperand = i;
            aCard.lowerOperand = j;
            aCard.theOperator = mathOper;
            aCard.theResult = i + j;

            UITextView* upperTextView = [[UITextView alloc] initWithFrame:CGRectMake(5, 5, 50, 20)];
        NSString* upperOper = [[NSString alloc] initWithFormat:@"     %d", i];
        upperTextView.text = upperOper;
        [aCard addSubview:upperTextView];
        [upperTextView release];
        [upperOper release];

        UITextView* middleTextView = [[UITextView alloc] initWithFrame:CGRectMake(5, 30, 50, 20)];
        NSString* middleOper = [[NSString alloc] initWithFormat:@"%@  %d", mathOper, j];
        middleTextView.text = middleOper;
        [aCard addSubview:middleTextView];
        [middleTextView release];
        [middleOper release];

        UITextView* lowerTextView = [[UITextView alloc] initWithFrame:CGRectMake(5, 55, 50, 20)];
        NSString* lowerOper = [[NSString alloc] initWithFormat:@"     %d", j+i];
            lowerTextView.text = lowerOper;
            [aCard addSubview:lowerTextView];
            [lowerTextView release];
            [lowerOper release];

            [cards addObject: aCard];
            [aCard release];
        }
    }
    return self;
}

- (id)newCardFromDeck {
    int index = random() % [cards count];
    Card* selectedCard = [[cards objectAtIndex:index] retain];
    [cards removeObjectAtIndex:index];
    return selectedCard;
}

@end

Я делаю то же самое, когда запрашиваю новую карту из метода newCardFromDeck ионо работает.Есть предложения?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 09 июля 2010

Добавьте этот код в файл Deck.m:

- (void)dealloc
{
    [cards release];
    [super dealloc];
}
2 голосов
/ 09 июля 2010

Глядя на эту строку кода:

cards = [[NSMutableArray alloc] init];

Вы выпускаете cards в вашем dealloc методе?Похоже, это может потенциально быть утечкой памяти.

0 голосов
/ 10 июля 2010

В newCardFromDeck:

Card* selectedCard = [[cards objectAtIndex:index] retain];

похоже, что вы сохраняете карту и возвращаете ее куда-нибудь.Где это возвращаемое значение заканчивается?Если он попадает в другую переменную со свойством 'retain', его можно сохранить во второй раз (после присвоения переменной).

0 голосов
/ 10 июля 2010

aDeck в generateDeck также будет утечкой, если вы не освободите его в dealloc представления.

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