想要完全释放对象的内存

时间:2013-03-06 07:27:29

标签: iphone ios memory-management memory-leaks

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

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和39 MB,因为之前的内存没有完全解除因内存过多而导致崩溃。

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

1 个答案:

答案 0 :(得分:3)

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

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

这是因为pdfView的设置者也会调用retain

您需要使用:

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

同样删除此声明,因为没有必要:

[self.pdfView release];

这就足够了:

self.pdfView = nil;

我建议在pdfView方法中分配init并在dealloc中发布,只需在viewDidLoad中更改视图中的PDF按下更改PDF 按钮。每当其内容发生变化时,init / addSubview / removeFromSuperview / release PDFView对象就无需更改。