繁体   English   中英

NSDocument-内存泄漏和应用程序崩溃

[英]NSDocument - memory leak & app crash

我的基于文档的应用程序中发生内存泄漏。 它启动正常,我可以打开或制作一个新文档,但是只有一两次,然后该应用程序崩溃了。 我在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方法的方法。

我不知道错误在哪里。当我关闭应用程序中的文档时,是否应该释放文档子类实例?

欢迎任何帮助。 谢谢。

作为一个疯狂的猜测,您是否实现了-[IVPMachine setDelegate:]以保留委托? 如果是这样,请不要这样做。 代表应该是弱项,即不留任。 您拥有IVPMachine,因此,如果您拥有IVPMachine,则为循环所有权,这是使文档和IVPMachine都存活的原因。

实际上,请在“乐器”中进行更多挖掘。 它不仅可以告诉您泄漏了某些内容,还可以告诉您发生的所有保留和释放。 浏览该列表以查找未平衡的保留。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM