关于removeFromSuperview关键的几个点

时间:2022-09-13 20:28:34

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

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


分析:

这里有两个关键点,可以帮助我们理解在ios当中view是怎么来组织的:a。视图的组织形式;b。响应者链;

今天只分析一下视图的组织形式,关于响应者链是和事件处理息息相关的,另文再写。

在ios当中,视图的设计模式可以看做是组件模式,即以树作为存储的数据结构,这种数据结构具有明确的两个特点:

1.父子关系分明,从根节点出发,通过叶节点向下扩展,同一枝的上一个节点就是下一个节点的superview,下一个节点就是上一个节点的subview;不同枝如果同层,则为兄弟节点。

2.layer关系分明,layer在ios中对事件响应具有举足轻重的作用,通常两个重叠的控件,处在上层的会优先响应;

从上面文档的描述,我们可以看到,这两个特性,也是view在操作时候的核心,即一个view的操作关系到两个方面,视图结构和响应者链。

removeFromSuperview,类似一个剪枝,执行此函数,就等于在树形结构中找到该节点,剪去该节点及其子节点,而并非只是剪去该节点自己。同时,另一个操作就是把该对象从响应者链中移除。


- (void)removeFromSuperview
Discussion
If the receiver’s superview is not nil, the superview releases the receiver. If you plan to reuse a view, be sure to retain it before calling this method and release it again later as appropriate.

译:如果当前view对象的父视图不为空,则父视图会release一次当前视图对象。如果你还想重用当前view,你应该在调用removeFromSuperview之前,retain一次当前view对象,但不要忘记,在恰当的时候要release它,以确保没有内存泄露。


Never call this method from inside your view’s drawRect: method.

永远不要在你的view的drawRect方法中调用removeFromSuperview;