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

  • 相关阅读:
    内核开发特点
    制作 patch
    sdram flash 区别
    数组名 函数名
    Html标签见解——关于position问题分组总结
    Html标签见解——margin和padding使用过程中所谓的bug问题《一》
    HTML标签见解——img
    关于float和clear
    业内杂谈——你认识“用户体验”吗?
    css控制窗口上下水平居中方案详解
  • 原文地址:https://www.cnblogs.com/xiaobai51/p/5631681.html
Copyright © 2020-2023  润新知