1

在一个控制器中,我通过以下方式添加其他控制器的视图:

objSecondController = nil;
objSecondController = [[SecondController alloc]initWithNibName:@"SecondController"
                                                        bundle:nil];
[self.view addSubview:objSecondController.view];

鉴于确实加载了 objSecondController,我执行以下操作:

self.pdfView = [[PDFView alloc] init];     
[self.view addSubview:self.pdfView.view];

然后我根据它的方法指定pdf

在更改 pdf 的按钮单击方法之一中,我执行以下操作:

if(self.pdfView)
{
    [self.pdfView.view removeFromSuperview];
    [self.pdfView release];
    self.pdfView = nil;
}

然后再做:

self.pdfView = [[PDFView alloc] init];     
[self.view addSubview:self.pdfView.view];

然后我根据它的方法指定pdf

现在 self.pdfView 是第三方库,每当我使用 self.pdfview 时,它的保留计数会自动增加,所以当我释放 self.pdfView 时,它的保留计数不会变为 0,因此即使我释放它们它也不会解除分配。

pdf 文件大小分别为 25MB 和 39MB,因此之前的内存不会完全释放,它会因内存过多而崩溃。

我应该怎么做self.pdfView完全释放内存,所以在加载其他大pdf时不会产生问题?

4

1 回答 1

3

假设您已经正确实现了 setter/getter 方法,那么您将pdfView使用此代码保留太多次:

self.pdfView = [[PDFView alloc] init];
[self.view addSubview:self.pdfView.view];

这是因为 setter forpdfView也会调用retain.

你需要使用:

self.pdfView = [[[PDFView alloc] init] autorelease];
[self.view addSubview:self.pdfView.view];

同时删除此语句,因为它不是必需的:

[self.pdfView release];

因为这就足够了:

self.pdfView = nil;

我建议pdfViewinit方法中分配并释放它,然后在按下更改 PDF按钮时更改dealloc视图中的 PDF。///每当对象的内容发生变化时,都不需要对象。viewDidLoadinitaddSubviewremoveFromSuperviewreleasePDFView

于 2013-03-06T10:21:34.580 回答