NSDocument - утечка памяти и сбой приложения - PullRequest
0 голосов
/ 01 октября 2011

У меня утечка памяти в приложении на основе документов.Он запускается нормально, я могу открыть или сделать новый документ, но только один или два раза, а затем приложение вылетает.Я использовал анализируемый инструмент в XCode и нет никаких проблем.

Однако Instruments обнаруживает утечку памяти, но я не могу найти, где она находится в моем коде.
Используя Распределение объектов, я вижу, что мой подкласс NSDocument не освобождается при закрытии документа... Я действительно не знаю, является ли это предполагаемым поведением.

Вот как я читаю и пишу документ:

-(NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
    NSMutableData *d = [NSMutableData data];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]
                                 initForWritingWithMutableData:d];
    [archiver encodeObject:[self machine]
                    forKey:IVPCodingKeyMachine];
    [archiver finishEncoding];
    [archiver release];
    if(outError) {
        *outError = [NSError errorWithDomain:NSOSStatusErrorDomain
                                        code:unimpErr
                                    userInfo:NULL];
    }
    return d;
}

-(BOOL)readFromData:(NSData *)data
             ofType:(NSString *)typeName
              error:(NSError **)outErro {
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]
                                     initForReadingWithData:data];
    machine = [[unarchiver decodeObjectForKey:IVPCodingKeyMachine] retain];
    [machine setDelegate:self];
    [unarchiver finishDecoding];
    [unarchiver release];
    if(outError) {
        *outError = [NSError errorWithDomain:NSOSStatusErrorDomain
                                        code:unimpErr
                                    userInfo:NULL];
    }
    return YES;
}

Свойство machine объявлено так:@property(readonly) IVPMachine *machine; в классе machine ivar и IVPMachine соответствует протоколу NSCoding.В случае новых документов я переопределил метод -(id)initWithType:(NSString *)typeName error:(NSError **)outError;, здесь я использую код:

-(id)initWithType:(NSString *)typeName error:(NSError **)outError {
    self = [super initWithType:typeName error:outError];
    if (self) {
        machine = [[IVPMachine alloc] initWithCreditAmount:2000];
        [machine setDelegate:self];
        [machine setGame:[[IVPGamesLibrary sharedInstance]
                           objectInGamesAtIndex:0]];
    }
    return self;
}

Наконец, в методе -(void)dealloc; я выпускаю machine ivar.

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

Любая помощь приветствуется.Спасибо.

1 Ответ

1 голос
/ 01 октября 2011

Как дикое предположение, вы реализовали -[IVPMachine setDelegate:], чтобы сохранить делегата? Если так, не делай этого. Делегаты должны быть слабыми ссылками, то есть не сохраняющими. Вы являетесь владельцем IVPMachine, поэтому, если он принадлежит вам, это круговое владение, и именно это поддерживает как документ, так и IVPMachine.

На практике копайте еще немного в инструментах. Он может сказать вам не только о том, что вы что-то утекли, но и о каждом сохранении и выпуске, которые произошли с ним. Просмотрите этот список, чтобы найти удержание, которое не сбалансировано.

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