zoukankan      html  css  js  c++  java
  • 【转】iOS_assign,retain,weak,strong的引用计数区别(附代码示例)

    先做个笔记:

    copy:此属性只对那些实行了NSCopying协议的对象类型有效。

    关于这四者的关系,不需要再解释太多。简单的一句话:assign和retain是旧版本的语法,新版本的已对应更改为weak和strong。

    即:
    assign相当于weak,
    retain相当于strong。


    用strong声明的属性赋值给了weak声明的属性,当strong释放的时候,weak会因为它所指向的内存过早被释放而crash。

    举个不恰当又能够描述的例子:

    实例化一个对象后,就会开辟一个内存空间(你们懂的),当一个strong属性指向该内存的时候(相当于一个土匪占山为王:这块地盘是我的)。小罗罗(weak属性)可以加入山寨(访问内存)共享地盘(访问数据),但weak撼动不了strong的强势。weak可以随时离开那块内存,但只要strong声明的属性一直占用内存就永不被释放。如果土匪头目(strong属性)弃山寨而走(释放内存),小罗罗(weak属性)没有了强者投靠只能跟着弃寨离开(释放内存)不再享有寨上的所有东西(访问数据)。如果山寨有两个土匪头目(两个strong属性指向同一块内存),就算离开一个,山寨依然在另一个强者手上(内存被另一个strong属性占用)。


    若还是不明白,那就上代码了!

    Ps:看到有些博文用NSString做的demo,亲测结果与他们写的不一样,因为字符串是个很特殊的东西。所以,在此我自定义一个Student学生类用来演示。

    一个strong多个weak,当strong释放掉的时候,weak所指向的就位空:


    一个strong,多个weak,其中一个weak释放掉,strong保持对内存的占有,weak的释放也不会使对应的内存释放。

    多个strong的时候,不论释放了多少个strong属性,只要还有一个保持对内存的占有,内存就不会释放:

    多个strong,只有全部的strong都释放了内存,内存才会被回收利用。



    from:https://blog.csdn.net/ndscoahz/article/details/44647221

    文章乃参考、转载其他博客所得,仅供自己学习作笔记使用!!!
  • 相关阅读:
    静态内存不能跨函数使用
    多级指针
    数组大小的动态分配
    luoguP1629 邮递员送信
    luoguP1119 灾后重建
    luoguP1395 会议
    树的重心
    luoguP5536 【XR-3】核心城市
    树的直径
    luoguP5836 [USACO19DEC]Milk Visits S
  • 原文地址:https://www.cnblogs.com/xuan52rock/p/15005799.html
Copyright © 2011-2022 走看看