zoukankan      html  css  js  c++  java
  • 强引用和弱引用

      昨天看到一篇技术博客,提到了关于内存持续增长的问题,进而提到了开发中属性声明的强引用和弱引用的问题。一般默认情况下,当声明一个对象的时候,这个对象是强引用的,强引用持有这个对象,只要引用存在,对象就不能被销毁,而弱引用不持有对象。强引用可以释放对象,而弱引用不可以,因为弱引用不持有对象。当弱引用指向一个强引用持有的对象的时候,强引用把对象释放掉,弱引用会自动指向nil。

      示例代码如下:

      

     1 #import <UIKit/UIKit.h>
     2 #import "AppDelegate.h"
     3 
     4 int main(int argc, char * argv[]) {
     5     @autoreleasepool {
     6         //声明弱引用对象
     7         id __weak weakObj = nil;
     8         if (YES) {
     9             id strongObj = [[NSObject alloc] init];
    10             weakObj = strongObj;
    11             NSLog(@"weakObj:%@", weakObj);
    12         }
    13         
    14         NSLog(@"weakObj:%@", weakObj);
    15         
    16         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    17     }
    18 }

      控制台打印出的数据如下:

    2015-07-18 11:42:08.506 Reference-text[36627:4447807] weakObj:<NSObject: 0x7fac02610030>

    2015-07-18 11:42:08.511 Reference-text[36627:4447807] weakObj:(null)

      分析结果:在if语句里面,声明了一个强引用的对象,并让弱引用指向这个强引用,第一个weakObj就是有值输出,当超出if语句的范围后,强引用释放对象,弱引用会自动的指向nil。

      可以做一个比较形象的比方,把对象比作气球,把强引用比作拉住气球的绳子,把弱引用比作知道气球具体位置的小孩,当有多个强引用指向改对象,即当有多条绳子拉住气球,只有当所有的强引用都释放掉对该对象的引用,即当所有绳子都断掉,气球才会飞走,而小孩也只能看着气球飞走,也不能去抓住那个气球。

      在Objective-C中,strong相当于retain属性,weak相当于assign属性,当为了避免循环引用的时候,需要用到weak属性,一般系统默认是strong熟悉。

  • 相关阅读:
    01-移动端 REM 适配(postcss-pxtorem,lib-flexible的使用)
    19-webpack性能优化集锦
    10-map/WeakMap/WeakSet的使用场景
    03-web worker vue项目实战
    ELFhash
    哈希查找
    Logger之Logger.getLogger(CLass)使用(转载)
    mybatis中多对一查询
    IDEA中无法打开查看log文件解决方案
    Self-Supervised Scene De-occlusion(转载)
  • 原文地址:https://www.cnblogs.com/qirutr/p/4656503.html
Copyright © 2011-2022 走看看