Не могу понять, как избавиться от утечки памяти - PullRequest
1 голос
/ 11 мая 2010

Я пытаюсь проверить на утечки памяти в моем iphone, и мне не повезло избавиться от этого. Вот код, который течет.


- (id)initWithManagedObjectContext:(NSManagedObjectContext *)aMoc delegate:(id)aDelegate runSync:(BOOL)aRunSync {
    if (self = [super init]) {
        self.moc = aMoc;
        self.settingsManager = [[VacaCalcSettingsManager alloc] initWithManagedObjectContext:self.moc];
        self.delegate = aDelegate;
        calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        self.runSync = aRunSync;
    }

    return self;
}

Утечка на линии self.settingsManager = [[VacaCalcSettingsManager alloc] initWithManagedObjectContext:self.moc];.

Переменная экземпляра self.settingManager высвобождается в методе dealloc класса.

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

Спасибо за любую помощь.

-Марк

Вот заголовочный файл.


@interface VacaCalcCalculation : NSObject {
    NSManagedObjectContext *moc;
    VacaCalcSettingsManager *settingsManager;
    id delegate;
    NSCalendar *calendar;
    NSDate *nextBankLimitDate;
    BOOL runSync;
}

@property (nonatomic, retain) NSManagedObjectContext *moc;
@property (nonatomic, retain) VacaCalcSettingsManager *settingsManager;
@property (nonatomic, retain) id delegate;
@property (nonatomic, retain) NSCalendar *calendar;
@property (nonatomic, retain) NSDate *nextBankLimitDate;
@property (nonatomic) BOOL runSync;

- (id)initWithManagedObjectContext:(NSManagedObjectContext *)aMoc delegate:(id)aDelegate;

1 Ответ

7 голосов
/ 11 мая 2010

Если для вашего свойства settingsManager установлено значение retain, вы сохраняете объект дважды со строкой: self.settingsManager = [[VacaCalcSettingsManager alloc] initWithManagedObjectContext:self.moc];

Попробуйте добавить autorelease к alloc]init или создать метод класса в VacaCalcSettingsManager, который возвращает объект с автоматическим освобождением. В противном случае вы можете повторно объявить вашу собственность с помощью assign, чтобы она не сохраняла объект во второй раз.

...