码迷,mamicode.com
首页 > 移动开发 > 详细

iOS strong与weak的使用

时间:2016-07-01 01:09:21      阅读:518      评论:0      收藏:1      [点我收藏+]

标签:

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的使用

标签:

原文地址:http://www.cnblogs.com/xiaobai51/p/5631681.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!