addSubView需要注意的几个点为什么要在addsubview:一个view对象后,release它?

addSubview:

Adds a view to the end of the receiver’s list of subviews.

译:增加一个视图到接收者的子视图列表中。

- (void)addSubview:(UIView *)view

Parameters

view

The view to be added. This view is retained by the receiver. After being added, this view appears on top of any other subviews.

译:view参数代表被增加的view,这个view会被它的接收者retain一次(即引用计数+1)。增加完成之后,这个view将出现在接收者的其他子视图的上面。

ps:关于子视图的出现的层次的问题,可以从这些子视图被保存的数据结构来探寻答案 ,每个视图都有个数组的属性,subviews,这个就是保存的它的子视图的引用。而这个数组的顺序就是代表了各个子视图被加入时的顺序。index=0 的就是最先被加入进去的,以此类推。所以,索引值越高的视图越不容易被覆盖。

Discussion

This method retains view and sets its next responder to the receiver, which is its new superview.

译:这个方法会retain一次view,并且设置它的下一个响应者是receiver,即它的新的父视图。

ps:在removeFromSuperview里已经说过,其实视图直接的操作往往牵涉到两个方面的操作,一个是视图的数据结构,一个是响应者链。当然,addsubview也不例外。

Views can have only one superview. If view already has a superview and that view is not the receiver, this method removes the previous superview before making the receiver its new superview.

译:每一个视图只能有唯一的一个父视图。如果当前操作视图已经有另外的一个父视图,则addsubview的操作会把它先从上一个父视图中移除(包括响应者链),再加到新的父视图上面。

Availability

  • Available in iOS 2.0 and later.

See Also

  • – insertSubview:atIndex:
  • – insertSubview:aboveSubview:
  • – insertSubview:belowSubview:
  • – exchangeSubviewAtIndex:withSubviewAtIndex:

addSubview和insertSubview的区别

addSubview 是将view加到所有层的最顶层

相当于将insertSubview的atIndex参数设置成view.subviews count

[view addSubview:oneview] == [view insertSubview:oneview atIndex:view.subviews count]

addSubview是加到最后 insertSubview是加到指定的位置

为什么要在addsubview:一个view对象后,release它?

先看代码:

1 2 3

IMGView *imgView = [[IMGView alloc] initWithFrame:CGRectMake(10, 0, 300, 300)]; [self.view addSubview:imgView]; [imgView release];

为什么imgView要release呢?可能很多人跟我一样,之前不是很清楚。 我们逐行分析一下

第一行,alloc一次,imgView对象retainCount为1, 第 二行,addSubview一次,此方法会把你传过去的对象retain一次,那么此时它的retainCount为2。self.view变为它的第二 个待有者。参考:The receiver retains view. If you use removeFromSuperview to remove view from the view hierarchy, view is released. 第三行,调用release方法,此处释放对imgView的所有权,retainCount减1。

到语言句尾imgView的所有者只剩下self.view,并且它的retainCount仅为1。内存管理第一铁则,谁retain(alloc,copy)谁release(autorelease)。上述的做法也是为了符合这一准则。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏静默虚空的博客

React基础篇 - 02.JSX 简介

JSX 简介 请观察下面的变量声明: const element = <h1>Hello, world!</h1>; 这种看起来可能有些奇怪的标签语法既不是字符...

21350
来自专栏谦谦君子修罗刀

RN生命周期-陪你到繁花落尽

有些事情,由天注定,从出生开始,到死亡结束。一个转身就是沧海桑田。 有些代码,由你书写,从出生开始,到死亡结束。一次擦肩就是bug满天飞~ ok,你以为我还是...

346100
来自专栏mukekeheart的iOS之旅

iOS学习——iOS开发小知识点集合

  在iOS学习和开发过程中,经常会遇到一些很小的知识点和问题,一两句话就可以解释清楚了,这样的知识点写一篇随笔又没有必要,但是又想mark一下,以备不时之需,...

373100
来自专栏Java学习网

Java中图片处理工具类——能满足各种需求

在多年Java开发过程中我总结了一些处理图片的方法,把代码分享出来与大家一起学习,代码如下: import java.awt.Color; import ja...

1.5K90
来自专栏DannyHoo的专栏

OC中的除法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

13420
来自专栏向治洪

React 之props属性

React 里有一个非常常用的模式就是对组件做一层抽象。组件对外公开一个简单的属性(Props)来实现功能,但内部细节可能有非常复杂的实现。 可以使用 JSX ...

22750
来自专栏偏前端工程师的驿站

动手写个数字输入框2:起手式——拦截非法字符

前言  最近在用Polymer封装纯数字的输入框,开发过程中发现不是坑,也有不少值得研究的地方。本系列打算分4篇来叙述这段可歌可泣的踩坑经历: 《动手写个数字输...

22180
来自专栏更流畅、简洁的软件开发方式

基类、接口的应用——表单控件:一次添加、修改一条记录,一次修改多条记录。(上)

好久没发帖子了,又加了不少的功能呀。(图片仅是测试,不代表什么表情。) 本来我也想写一个2007的总结的,但是看到很多人都写了,我就不凑热闹了,写点和代码有关...

19950
来自专栏前端杂货铺

异步Promise实现

简介    异步回调的书写往往打乱了正常流的书写方式,在ECMAScript 6中实现了标准的Promise API,旨在 解决控制回调流程的问题。   简单的...

364100
来自专栏keyWords

2、React组件的生命周期

  - 因为在ES6语法下,类的每个成员函数在执行时的this并不是和类实例自动绑定的;   - 而在构造函数中this就是当前组件实例,所以,为了方便将来调...

9520

扫码关注云+社区

领取腾讯云代金券