iOS strong与weak的使用
strong修饰的属性是强指针类型的,weak修饰的属性是弱指针类型的
ARC对于内存中的对象管理机制,当某个对象没有被强指针指向的时候,该对象就会被销毁。
所以不适当的使用strong和weak修饰属性容易造成内存泄露。
OC对象(继承NSObject的类创建的对象)用strong修饰。
UI控件连线的时候都会用weak修饰,给了大家一个假象。就是UI控件属性都是用weak修饰的。这种说法是错误的
当我们连线的时候,storyboard会根据图层结构分析,判断是否使用weak修饰,验证:
任何一个控制器都会对应一个根视图:

在stroyboard的表现形式为

所以,当前的图层结构为

每个UIUiew都是一个容器,可以存放其它的UIView,所以UIView有一个subviews属性

subviews是一个数组。数组是一个集合,当我们把某个对象存储到集合中的时候,集合就会对该对象有一个强指向。
这里的copy涉及到深拷贝和浅拷贝的知识。深拷贝会创建新的对象,并且把新的对象的地址赋值给subviews属性
浅拷贝不会创建新的对象,知识拷贝当前数组对象的地址,并且把地址赋值给subviews属性。无论是深拷贝,浅拷贝。subviews都是一个强指针。
所以,当前的层级关系是

所以,当我们向stroyboard中拖拽控件的时候。在storyboard中的层级表现形式为

即

这时,viewController已经有一个强指针间接指向UISwitch对象了。当我们连线的时候,设置的viewController的属性,如果此时再用strong修饰switch属性。
就会出现这样的情况

viewController对同一个对象强引用了两次,不符合ARC内存管理机制。所以storyboard分析以后,默认我们使用weak修饰连线的属性。
即

此时,图层结构为

下面,我把控制器自带的view给删除掉。此时self.view= nil;所以强指针指向就断开了


这个时候,我拖拽一个imageView控件,

这个时候,imageView没有被强指针指向,所以,当我们给imageView拖线的时候,storyboard分析,viewController没有对imageView强引用,此时viewcontroller需要强指针指向。
所以storyboard就会建议我们使用强指针。此时的层级关系是

所以,当我们给imageview拖线的时候:

所以,UI控件通过连线并不一定是用weak修饰的。面试的时候经常会被问到,一定要记住!!!不要掉进面试官的坑里。
iOS strong与weak的使用的更多相关文章
- iOS Strong 和 weak
iOS 5 中对属性的设置新增了strong 和weak关键字来修饰属性(iOS 5 之前不支持ARC) strong 用来修饰强引用的属性: @property (strong) SomeClass ...
- IOS strong和weak的区别
strong和weak的区别 strong表示保留它指向的堆上的内存区域不再指向这块区域了. 也就是说我强力指向了一个区域,我们不再指向它的条件只有我们指向nil或者我自己也不在内存上,没有人stro ...
- iOS strong 和weak的形象理解
转自:http://hi.baidu.com/phone_lwc/item/c36e5bfe1cf9c313ce9f32be 觉得讲的很容易理解 The difference is that an o ...
- IOS开发 strong,weak,retain,assign,copy nomatic 等的区别与作用
strong,weak,retain,assign,copy nomatic 等的区别 copy与retain:1.copy其实是建立了一个相同的对象,而retain不是:2.copy是内容拷贝,re ...
- iOS - property,strong,weak,retain,assign,copy,nomatic 的区别及使用
1:ARC环境下,strong代替retain.weak代替assign,xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支持ARC的.xcod ...
- iOS retain、strong、weak、assign
iOS retain.strong.weak.assign strong与weak是由ARC新引入的对象变量属性xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和a ...
- iOS内存管理retain,assign,copy,strong,weak
转自:http://www.cnblogs.com/nonato/archive/2013/11/28/3447162.html iOS的对象都继承于NSObject, 该对象有一个方法:retain ...
- [转]iOS ARC机制 weak strong
写在开头 虽然距离WWDC2011和iOS 5已经快一年时间,但是很多开发者并没有利用新方法来提高自己的水平,这点在ARC的使用上非常明显(特别是国内,基本很少见到同行转向ARC).我曾经询问过一些同 ...
- 【iOS开发系列】XIB IBOutlets use strong or weak ?
有人问.在ARC下,IBOutlets究竟应该定义成strong 还是 weak ?支持这个答案的人最多.答案仅是摘自官方文档的一个片段: From a practical perspective, ...
随机推荐
- C注意,使用的语言字符串
转载请注明出处! 在C语言没有具体的字符串数据类型,字符串的字符串常量和字符数组的形式. 实际上该字符串是零个或更多字符的字符串.并在整个位模式0NUL字节结束.因此,字符串所包括的字符内部不能出现N ...
- 【转】Android折叠效果实现案例
源文:http://mobile.51cto.com/abased-401983.htm 为了使界面的效果更加绚丽,体验效果更佳,往往需要开发者们自行开发新的界面效果,在这里,我将奉上各种实现折叠效果 ...
- AngularJs ng-repeat 必须注意的性能问题
AngularJs 的 ng-repeat 让我们非常方便的遍历数组生成 Dom 元素,但是使用不当也会有性能问题. 在项目中我们使用 ng-repeat 加载完一个列表后,如果再次请求数据,然后过滤 ...
- Java 感知Mysql存储过程变量数量
在项目中,可能会遇到sybase 移植到 mysql的情况,因为sybase 支持存储过程的可变参数,而mysql不能支持,所以,在调用mysql的时候,需要感知存储过程到底有几个参数,来合理的配置参 ...
- 路由模块router实现step1
hashchange事件 参考:http://www.cnblogs.com/rubylouvre/archive/2012/10/24/2730599.html 需要解决的问题: 1.IE6/7及兼 ...
- POCO Controller
---恢复内容开始--- POCO Controller 你这么厉害,ASP.NET vNext 知道吗? 写在前面 阅读目录: POCO 是什么? 为什么会有 POJO? POJO 的意义 PO ...
- iOS基础 - Quartz 2D绘图
一.Quartz 2D Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Mac OS X环境. Quartz 2D以PDF的规范为基础的图形库,用来绘制二维文字和图形,允许相同的绘图指令在任 ...
- 【学习笔记】锋利的jQuery(四)AJAX
一.load()方法 /* *如果没有参数传递,采用GET方式传递 *如果有参数,则自动转换成POST方式传递 *无论Ajax是否请求成功,请求完成后回调函数触发 */ load("test ...
- Knockout 可扩展性
你需要知道的顶级特性 Knockout 最棒的一个特点就是它的可扩展性.Knockout 存在大量的扩展点,包含大量的工具来创建我们的应用程序.许多开发者除了 Knockout 核心库之外没有使用任何 ...
- C# 多线程学习总结
C# 多线程学习总结 C#多线程学习(一) 多线程的相关概念 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. ...