У меня утечка памяти в приложении на основе документов.Он запускается нормально, я могу открыть или сделать новый документ, но только один или два раза, а затем приложение вылетает.Я использовал анализируемый инструмент в 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.
Я могуне могу понять, где находится ошибка .. Разве не должен быть освобожден экземпляр моего подкласса документа, когда я закрываю документ в своем приложении?
Любая помощь приветствуется.Спасибо.