zoukankan      html  css  js  c++  java
  • iOS---------开发中 weak和assign的区别

    weak和assign的区别-正确使用weak、assign

    一、区别

    1.修饰变量类型的区别
    weak只可以修饰对象。如果修饰基本数据类型,编译器会报错-“Property with ‘weak’ attribute must be of object type”。
    assign可修饰对象,和基本数据类型。当需要修饰对象类型时,MRC时代使用unsafe_unretained。当然,unsafe_unretained也可能产生野指针,所以它名字是"unsafe_”。

    2.是否产生野指针的区别
    weak不会产生野指针问题。因为weak修饰的对象释放后(引用计数器值为0),指针会自动被置nil,之后再向该对象发消息也不会崩溃。 weak是安全的。
    assign如果修饰对象,会产生野指针问题;如果修饰基本数据类型则是安全的。修饰的对象释放后,指针不会自动被置空,此时向对象发消息会崩溃。

    二、相似

    都可以修饰对象类型,但是assign修饰对象会存在问题。

    三、总结

    assign适用于基本数据类型如int,float,struct等值类型,不适用于引用类型。因为值类型会被放入栈中,遵循先进后出原则,由系统负责管理栈内存。而引用类型会被放入堆中,需要我们自己手动管理内存或通过ARC管理。
    weak适用于delegate和block等引用类型,不会导致野指针问题,也不会循环引用,非常安全。

     



  • 相关阅读:
    Base64
    HBase搭建
    解决Zookeeper无法启动的问题
    docker基础知识之挂载本地目录
    VMware升级到15版本虚拟机黑屏的解决方法
    docker端口映射或启动容器时报错Error response from daemon: driver failed programming external connectivity on endpoint
    MQTT 入门介绍
    OpeTSDB的Configuration配置
    js中ES6的Set的基本用法
    Review-JVM
  • 原文地址:https://www.cnblogs.com/KiVen2015/p/11203605.html
Copyright © 2011-2022 走看看