2

我正处于调整我的第一个 iphone 应用程序以供发布的最后阶段,并试图尽可能减少千字节。我有一个在应用程序启动时将一些数据与我的服务器同步的过程,当我将其注释掉时,我注意到,我的应用程序在完成启动时使用了 7MB。当我打开它时,它在完成启动时使用 18MB。我现在正试图确定该过程的哪一部分正在消耗内存而不是还给它。我已经关闭了大部分同步功能,剩下的就是这个,它仍然使用 2MB 内存,完成后不会释放它:

GDataXMLDocument *syncData = [[self getXmlWithUrl:@"http://SOMEURL"] autorelease];

这只是使用我的辅助函数来加载一个 xml 文档供我使用。我的辅助功能如下:

-(GDataXMLDocument*)getXmlWithUrl:(NSString*)url{
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
    NSURLResponse *resp = nil;
    NSError *err = nil;
    NSData *response = [NSURLConnection sendSynchronousRequest: theRequest returningResponse: &resp error: &err];
    return [[GDataXMLDocument alloc]initWithData:response options:0 error:&err];
}

我在创建 syncData 后发布了一个版本,但当然它说它已经被取消分配。关于可能导致这种情况的任何想法?

4

1 回答 1

0

两个想法。

  1. GDataXMLDocument 是一个基于 DOM 的解析。你的反应有多大?通常 DOM 解析需要 RAM 中原始文档大小的 2-4 倍,使用某些文本编码可能会更大。你真的需要 DOM 解析吗?我们尝试使用 SAX 完成所有工作,因此它是渐进式的并且内存效率更高。

  2. 您正在使用自动释放,因此在自动释放池清空之前不会释放内存。您可以使用自动释放池包装代码,然后将其处理掉。 http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html

Finally, synchronous HTTP requests are generally a bad idea because the performance of the network can be so variable and you'll block the UI thread.

于 2011-10-13T21:51:12.563 回答