addSubView需要注意的几个点

简介:

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)。上述的做法也是为了符合这一准则。

 


本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/p/3470550.html,如需转载请自行联系原作者

目录
相关文章
|
移动开发 Java 测试技术
iOS的App模块化编程的框架实现方案——BeeHive
BeeHive是用于iOS的App模块化编程的框架实现方案,吸收了Spring框架Service的理念来实现模块间的API耦合。
iOS的App模块化编程的框架实现方案——BeeHive
|
开发工具 git Windows
经验:停止 cherry-pick,请开始 merge!
cherry-pick 是一个比较常用的 git 操作,可以将一个分支上的 commit “精选”到另一个分支上。然而在最近的开发过程中,却时不时的遇到 merge 冲突。在下文中,我将会详细的分析 cherry-pick 造成冲突的原因,以及 cherry-pick 可能造成的其他更严重问题。
4658 0
经验:停止 cherry-pick,请开始 merge!
|
Oracle Java 关系型数据库
在 macOS 上安装 JDK 17
在 macOS 上安装 JDK JDK 支持基于 Intel (x64) 和 Apple Silicon (AArch64) 的 Mac 电脑。 本主题包括以下部分: 在 macOS 上安装 JDK 的系统要求 macOS JDK 安装说明符号 确定 macOS 上的默认 JDK 版本 在 macOS 上安装 JDK 在 macOS 上卸载 JDK macOS 安装常见问题
5315 0
|
安全 Swift
Swift-Currying(柯里化)
柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数切返回结果的新函数的技术
187 0
|
监控 Shell 调度
Mac创建定时任务
Mac创建定时任务
|
网络安全
iterm2配置教程
iterm2配置教程
iterm2配置教程
|
JSON 前端开发 JavaScript
手把手教你实现在Monaco Editor中使用VSCode主题
手把手教你实现在Monaco Editor中使用VSCode主题
1103 0
手把手教你实现在Monaco Editor中使用VSCode主题
|
数据采集 数据可视化 小程序
Python tkinter快速可视化开发GUI界面指南:详细教程(附带工具)
Python tkinter快速可视化开发GUI界面指南:详细教程(附带工具),可通过拖拽实现GUI代码的开发,适用对象 适用于学习了TKinter并不想太麻烦写GUI代码,也不想用其他工具和框架 比如wxPython,PyQt4的同学。 适用于界面不太复杂的小程序开发,界面复杂的还是适用wxPython等框架吧。 因为TKinter为Python标准库,使用TKinter完成的Python程序可以称为 “绿色软件”,不需要目标机器上安装wxPython,PyQt4等框架,只要有Python 的机器就能运行
3238 1
Python tkinter快速可视化开发GUI界面指南:详细教程(附带工具)
|
编解码 前端开发 Android开发
关于图片链接后拼参数处理的思考
关于图片链接后拼参数处理的思考
372 0
|
Android开发
Flutter 左右菜单联动
Flutter 左右菜单联动
718 0
Flutter 左右菜单联动