使用ARC弹出视图控制器后内存没有被释放

4

你好,我的项目是基于ARC的,我正在使用UINavigationController在视图控制器之间进行转换。我正在使用分析工具来分析内存背后发生了什么。我注意到当我推入一个视图控制器时,它会为所有组件分配内存,但当我弹出它时,它并没有释放已分配的内存。

由于我正在使用ARC,因此无法实现dealloc或释放任何组件。我已经进行了详细的分析,并且我的项目中没有内存泄漏。

我没有使用strong属性来推入视图控制器。以下是我推入视图控制器的方式。

viewController *obj = [[viewController alloc] init];
[self.navigationController pushViewController:obj animated:NO];

有什么线索吗?我该怎么做才能释放已经消耗的内存。请给予建议。


你可以在ARC中实现一个dealloc方法,但是不能调用[super dealloc]。如果需要清理任何资源,应该使用dealloc。很可能你的代码中存在保留循环。在你的代码上运行分析器。 - rmaddy
实现dealloc的目的是什么,因为我不能在其中释放任何组件。 - abdus.me
1
你可能需要处理很多其他任务,比如移除通知观察者或清理临时文件等。如果你不需要任何清理工作,那就不要实现 dealloc 方法。ARC 会负责释放对象,但它无法释放被困在保留循环中的东西。 - rmaddy
@rmaddy 一个问题:当使用ARC时,不是在viewWillDisappear:中删除通知观察者更好吗?我从未在使用ARC时使用过dealloc,我的方法始终是在视图不在屏幕上时删除不需要的观察者。因此,使用viewWillDisappear: - swiftcode
1
假设您将视图控制器(vc)B 推到 vc A 上方。这将导致在 vc A 上调用 view(Will|Did)Disappear。我仍希望 vc A 能够获得任何重要的通知,以便在 vc B 解散时它能够被正确更新。但这取决于您的需求。这里有一个好的经验法则 - 保持平衡。如果您在 viewWillAppear 中添加了某些内容,则在 viewDidDisappear 中删除它。如果您在 init 中添加了某些内容,则在 dealloc 中删除它。您明白了。 - rmaddy
显示剩余2条评论
1个回答

0

根据您的描述,您存在保留循环(retain cycle),导致对象无法被释放。保留循环的典型来源是通过加载NIB文件分配的属性(通常声明为IBOutlet)。

打破保留循环并释放对象的两种策略:

  1. 将属性声明为 weak:

    @property (nonatomic, weak) IBOutlet UILabel *statusLabel;
    
  2. viewDidUnload 中将属性设置为 nil:

    - (void)viewDidUnload 
    {
        self.statusLabel = nil;
        [super viewDidUnload];
    }
    

дҢ дёҚеғ”иҮӨе†ҚдҢүз”ЁviewDidUnloadдғ†гЂ‚ - testing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接