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修饰的。面试的时候经常会被问到,一定要记住!!!不要掉进面试官的坑里。