iOS 从父视图移除方法示例

视图结构

在iOS应用中,视图的结构是树型数据结构,以这种结构来控制视图显示,这种数据结构有一个很好的优点:

层级关系分明,并且方便传递事件。从根节点出发,通过叶节点向下扩展,同一枝的上一个节点就是下一个节点的superview,下一个节点就是上一个节点的subview。每个应用程序有一个主Window,这个Window就是根节点。

removeFromSuperview

每一个View都和视图结构和响应者链有直接的关系,但是这篇文章不打算着重的讲这两个方面,主要讲removeFromSuperview方法。将当前视图从其父视图移除,需要调用removeFromSuperview方法。下面是苹果对于这个API的官方定义:

Unlinks the receiver from its superview and its window, and removes it from the responder chain.

译:把当前View从它的父View和窗口中移除,同时也把它从响应事件操作的响应者链中移除。

removeFromSuperview就是一个视图节点删除的操作,执行这个方法,就等于在树形结构中找到该节点,从树型数据结构中删除该节点及其子节点,而并非只是删除该节点自己。同时,另一个操作就是把该对象从响应者链中移除。

执行removeFromSuperview方法,只是该视图不在屏幕中显示,并没有将该视图从内存中移除。所以我们如果需要使用该视图,不需要再次创建,而是直接addSubview就可以了。

对于这个API,苹果并没有给出过多的解释,只是简单的描述了一下这个API,以及说明了这个API的注意点。

内存陷阱

那如果是这样,那就遇到一个和我们之前认知不太相同的答案了。具体是什么问题,还是需要我们自己写代码验证,于是我基于上面描述的测试环境,写了一些关于视图的测试代码。

UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self.view addSubview:view];
[view release];
[view removeFromSuperview];
// 多次调用remove方法
[view removeFromSuperview];

经过我的测试发现,调用removeFromSuperview方法后引用计数并没有增加,调用完之后还是会release的。我们之前看到的引用计数的增加,是因为系统的隐藏操作导致的。之前在MRC时期经常发现retainCount不准确,这主要是因为iOS系统API的引用、或自动释放池导致的,所以retainCount并不能当做可靠的参考。

所以,如果调用多个release,还是会崩溃的,始终要相信iOS的MRC内存管理原则,这才是可靠的。可以多次调用removeFromSuperview方法,在已经移除父视图后,其他多余的调用不会改变任何引用计数。对于addSubview:方法也是一样的

时间: 2024-10-26 12:53:07

iOS 从父视图移除方法示例的相关文章

iOS中有遍历父视图的子视图的方法便于统一设置同类控件的属性,Android中有类似的方法吗?

问题描述 iOS中有遍历父视图的子视图的方法便于统一设置同类控件的属性,Android中有类似的方法吗? iOS不论是controller还是View视图都有获取子视图来遍历的方法,Android中对应的办法是什么, 如果Android中遇到了父视图中批量同类型子控件的同一属性的统一设置,该怎么办? 解决方案 Android中ViewGroup及其子类是装载View的容器,具有API:int getChildCount(), View getChildAt(int index),使用这两个方法可

ios开发-iOS开发 视图切换的方法,怎么用

问题描述 iOS开发 视图切换的方法,怎么用 视图切换,有几种方法,我知道几个,但是不知道怎么用,求大神的有用资源,谢谢 解决方案 1.add/remove view. 2.模态弹出. 3.导航push/pop

iOS 怎么获取button触点在父视图中的位置

问题描述 iOS 怎么获取button触点在父视图中的位置 场景:一个scrollview上加了一些button,现在点击button,想要通过触摸点在父视图中的位置,来设置scrollview的contentoffset属性,那么我要怎么获取点坐标呢 解决方案 CGRect frame = [self.button convertRect:self.button.bounds toView:self.scrollView]; 解决方案二: UITouch *touch = [touches a

开发IOS关于子UIViewController和父UIViewController相互调用方法

  今天在做iphone开发时碰到了一个常用的需求,即在一个viewController中添加另外一个viewController,同时能保证这两个ViewController之间能够相互交互且相互调用方法和函数,在网上查了很多资料,很多开发者说需要使用objective-c变态的 delegate,可是我感觉delegate是使用在两个同级之间的UIView比较好,至于能不能使用在父子关系而且是 UIVeiwController我也不太清楚,也没有亲自实验过,通过查看SDK的API及其他资料我

IOS开发之视图和视图控制器

        视图(View), 视图控制器(ViewController)是IOS开发UI部分比较重要的东西.在学习视图这一块的东西的时候,感觉和Java Swing中的Panel差不多.在UIKit框架中都有一个UIWindow来容纳我们的View.应用程序中几乎全部的可视控件都是UIView以及UIView的子类的实例,并且UIWindow也是UIView的子类.UIWindow可以不借助于父类视图显示在屏幕上,其余的视图都需要添加到父视图中才能显示.窗口是用来显示视图的,下面我们将会结

iOS翻页视图控制器UIPageViewController的应用

iOS翻页视图控制器UIPageViewController的应用 一.引言     UIPageViewController是iOS中少见的动画视图控制器之一,通过它既可以创建类似UIScrollView与UIPageControl结合的滚屏视图,也可以创建类似图书效果的炫酷翻页视图.UIPageViewController类似一个视图容器,其中每个具体的视图由各自的ViewController进行维护管理,UIPageViewController只进行协调与动画布置.下图可以很好的展现出UI

iOS开发系列--视图切换

概述 在iOS开发中视图的切换是很频繁的,独立的视图应用在实际开发过程中并不常见,除非你的应用足够简单.在iOS开发中常用的视图切换有三种,今天我们将一一介绍: UITabBarController UINavigationController 模态窗口 UITabBarController iOS三种视图切换的原理各不相同: UITabBarController:以平行的方式管理视图,各个视图之间往往关系并不大,每个加入到UITabBarController的视图都会进行初始化即使当前不显示在

弱引用-ios 与xib视图加载相关的内存管理问题

问题描述 ios 与xib视图加载相关的内存管理问题 在通过xib加载视图的时候,我们遵循一个准侧 那就是顶层视图 我们的成员变量要是强引用 若是非顶层视图,而是顶层视图的子视图,为了防止顶层视图被释放以后,字视图还存在而造成的内存泄漏,我们把这字视图的成员变量定义为弱饮用 现在问题是,在ARC模式下,假如我有个视图控制起ViewController,然后有个UIButton子视图 @interface ViewController:UIViewController {weak/strong I

《Swift iOS应用开发实战》——2.4 理解iOS 8的视图和窗口

2.4 理解iOS 8的视图和窗口 在前面几节的学习中我们已经为Calculator项目创建了用户界面,其中使用了视图.Label和Button控件,接下来我们将详细了解有关视图和窗口的概念.2.4.1 视图概述视图属于可视化对象,多个视图组合起来就组成了iOS应用程序的用户界面.视图本质上反映的是屏幕上的一块特定的矩形区域内所发生的事情,例如,根据用户的交互进行可视化方面的更新.所有视图都是UIKit框架中的UIView类的子类,例如UILabel.UIImageView.UIButton和U