簡體   English   中英

釋放ARC / non-ARC中的對象會使內存處於使用狀態

[英]Releasing objects in ARC/non-ARC leaves memory in use

我對內存管理有一個一般性的問題。 我可以使用以下代碼創建一個對象,將其填充數據,然后清理並釋放它,但是即使釋放該對象之后,它所使用的內存仍在使用中。

- (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之前使用大約9MB的空間( PDFObject* pdfObject = [[PDFObject alloc] init... ),在初始化和設置該對象時使用大約[pdfObject generateThumbnails:self.view.frame.size.width/10];空間( [pdfObject generateThumbnails:self.view.frame.size.width/10]; ),則在釋放pdfObject中的所有對象並且釋放pdfObject本身之后,程序仍使用約23MB的空間。 我在打開ARC並使用NSObject = nil強制釋放對象時遇到相同的問題。 當我嘗試創建和銷毀太多這些對象時,最終會導致崩潰。

我肯定缺少目標c內存管理的一些簡單部分,但我認為我遵循的是良好的做法(即,如果創建對象,則最終必須銷毀它)。 來自JAVA背景並沒有幫助。

使用ARC。 在2014年使用人工參考計數是很愚蠢的。 沒有合理的理由,這會使生活更加艱難。

鑒於您正在使用手動引用計數,因此您的代碼看起來很合理。 您創建了許多對象,但是它們似乎都是自動釋放的臨時對象,除了您分配/初始化的PDFObject之外,然后最后釋放。

我的猜測是PDFObject在內部進行圖像緩存。 那會導致您的應用程序的內存占用量增加,但不會變壞。 如果內存壓力增加,系統將在采取更嚴重的步驟(例如向您發送內存警告或終止您的應用程序)之前刷新緩存的圖像。

PDFObject類也可能在其中存在內存泄漏,或者它是在基於系統的圖像緩存之上進行自己的緩存。

您可能需要使用內存分析工具來查看添加到應用程序內存占用量中的對象。 但是,如何做到這一點超出了論壇的討論范圍。 過去有WWDC會話視頻,與此相關的還有很多博客文章和在線教程,它們解釋了如何使用工具工具來弄清楚為什么應用程序的內存使用量不斷增長。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM