【问题标题】:want to completely dealloc object's memory想要完全释放对象的内存
【发布时间】:2013-03-06 07:27:29
【问题描述】:

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

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时不会产生问题?

【问题讨论】:

  • 您使用的是 ARC 还是 MRR?您将不得不显示一些代码;闲聊无济于事。
  • 我已经编辑了我的问题。我不使用 ARC

标签: iphone ios memory-management memory-leaks


【解决方案1】:

假设您已正确实现 setter/getter 方法,那么您将使用此代码保留 pdfView one-too-many-times:

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;

我建议在init 方法中分配pdfView 并在dealloc 中释放它,并在viewDidLoad 和每当更改PDF 按钮时更改视图中的PDF按下。当 PDFView 的内容发生变化时,不需要 init/addSubview/removeFromSuperview/release 对象。

【讨论】:

  • 感谢您的回复。问题是该库仅支持一种更改 pdf 的方法,类似于“initwithpdf”,因此我需要初始化超时。同样在按钮单击以更改 pdf 时,不会调用 dealloc,并且在 dealloc 中我将无法释放或使该对象为零,因为我使用相同的变量来加载不同的 pdf,所以当时其他 pdf 必须是加载。我正在按照您的建议尝试自动发布。
  • @Vibhooti 真可惜。听起来你需要使用你当时已经实现的方法。
  • 但是库只使用这种方法来改变pdf,并且要求与库相关的所有东西都必须在转换为其他pdf之前变为nil
猜你喜欢
  • 2015-04-25
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
相关资源
最近更新 更多