在 UIView 生命周期中知道何时销毁视图

Posted

技术标签:

【中文标题】在 UIView 生命周期中知道何时销毁视图【英文标题】:Knowing when a view is going to be destroyed in UIView lifecycle 【发布时间】:2016-04-21 19:36:28 【问题描述】:

我有一个 UIView,它是 UIPageViewController 的一部分。 我将一个强对象传递给此视图,但在释放时遇到问题。

过去我认为我使用 viewDidUnload 来释放任何强对象,然后调用 Dealloc。现在由于强大的对象,交易永远不会被调用。

使用 UIPageViewController 了解 icm 对象不再需要的最佳方法是什么。 IE。如果它是用户正在查看的页面旁边的视图,它可能会重新出现。所以使用 viewWillDisappeart 将无法正常工作。

@interface DOTourFloorPlanViewController : UIViewController <UIScrollViewDelegate, DOAsyncImageViewDelegate> 
    IBOutlet DOAsyncImageView* _imageView;
    IBOutlet UIScrollView* _scrollView;

    NSMutableArray* _beaconLabels;

    UIView* _circle;
    UIView* _centerDot;

    DOTour* _tour;
    CGRect _zoomRect;

    int _circleCenterX;
    int _circleCenterY;

    bool _didZoomToLocation;


@property (strong, nonatomic) DOTour* tour;

【问题讨论】:

所以你有一个保留周期?应该是弱点吗?如果不显示代码/解释对象是什么引用,我们真的无能为力 我需要保留提供数据的核心数据对象,因为如果我不保留它,它将从 NSFetchedResultsController 中释放。我只是不知道何时可以安全地释放此视图中的对象 icm a UIPageViewVontroller,因为我不知道有什么方法可以知道何时不再使用该视图。 @Wain 实际上,我查看了代码,在这一刻我可能可以使链接变弱。现在测试,但这似乎解决了它。因此,如果您提出该建议作为答案,那么我接受它。 【参考方案1】:

不再卸载视图,较新的设备没有如此严格的内存限制,并且还有其他优化。看起来,当你说 view 时,你实际上指的是视图控制器,这有点令人困惑。

如果您的视图控制器 (VC) 提供了一些数据,它可以保留对它的引用,直到它被销毁。数据不应保留 VC 或其视图。如果您有任何类型的观察/委托,那么该链接应该很弱以防止保留周期。

通过这种方式,当不再需要 VC 时,即当它从其父级或演示者中删除时,数据将被释放。

特别是对于核心数据和对NSManagedObjects 的引用,您可以通过调用带有NO 标志的refreshObject:mergeChanges: 来帮助系统将对象变为故障并从内存中删除其数据。您可以在视图消失时执行此操作。

【讨论】:

以上是关于在 UIView 生命周期中知道何时销毁视图的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 中控制器的生命周期

Bean对象的生命周期

springbean的生命周期是啥?

在 JSF 中如何以及何时销毁 @ViewScoped bean?

学亮IT手记Servlet的生命周期

Servlet讲解