释放ARC /非ARC中的对象会使内存中使用

时间:2014-06-15 01:32:53

标签: ios objective-c memory-management

我对内存管理存在一般性问题。我可以使用以下代码创建一个对象,用数据填充它,然后清理并释放它,但即使在对象被释放后,它使用的内存仍在使用中。

- (void)viewDidLoad {
    [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    NSBundle *bundle1 = [NSBundle mainBundle];
    NSString *path = [bundle1 pathForResource:@"Oxford Latin Dictionary - Optimized" ofType:@"pdf"];
    NSURL *pathURL = [NSURL fileURLWithPath:path];
    PDFObject* pdfObject = [[PDFObject alloc] initWithURL:pathURL withCachedPages:25 startAtPage:1 withFrame:self.view.frame];
    [pdfObject readPdfAtPage:1];
    [pdfObject generateThumbnails:self.view.frame.size.width/10];
    [pdfObject cleanThumbnailsAndSubviews];
    [pdfObject clearMemory];
    [pdfObject release];
}

在创建pdfObject(PDFObject* pdfObject = [[PDFObject alloc] init...)之前,程序使用大约9MB,当初始化和设置该对象([pdfObject generateThumbnails:self.view.frame.size.width/10];)时,它使用大约23MB,然后程序仍然使用大约23MB pdfObject中的对象被释放,pdfObject本身被释放。我打开ARC并使用NSObject = nil强制释放对象时遇到同样的问题。当我尝试创建和销毁太多这些对象时,这最终会导致崩溃。

我必须错过目标c内存管理的一些简单部分,但我认为我遵循了良好的做法(即如果你创建了一个对象,你必须最终销毁它)。来自JAVA背景并没有帮助。

1 个答案:

答案 0 :(得分:0)

使用ARC。在2014年使用手动引用计数是愚蠢的。没有充分的理由,它会使生活更加艰难。

鉴于您使用的是手动引用计数,您的代码看起来很合理。您创建了许多对象,但它们看起来都是自动释放的临时对象,除了您分配/ init的PDFObject,然后在最后发布。

我的猜测是PDFObject正在内部进行图像缓存。这会导致应用程序的内存占用率上升,但不会很糟糕。如果内存压力增加,系统将在执行更严重的步骤之前刷新缓存的图像,例如发送内存警告或终止应用程序。

PDFObject类也可能存在内存泄漏,或者它在基于系统的图像缓存之上进行自己的缓存。

您可能希望使用内存分析工具来查看添加到应用程序内存占用的对象。然而,解释如何做到这一点超出了论坛帖子的范围。过去有关于此的WWDC会话视频,并且还有不少博客文章和在线教程解释了如何使用工具工具来弄清楚应用程序的内存使用增长的原因。