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

  • 相关阅读:
    Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can't find referenced class问题的解决方案
    Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
    接口的作用
    Android中Service(服务)详解
    跟 Task 有关的 Intent对象中设置的Flag
    android onNewIntent
    [Android]如何导入已有的外部数据库
    android的文件操作
    MVC 数据验证
    Html辅助方法 之 Form表单标签
  • 原文地址:https://www.cnblogs.com/xiaobai51/p/5631681.html
Copyright © 2011-2022 走看看