• 强引用和弱引用


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

  • 相关阅读:
    常用算法解析-动态规划
    转载-通过ApplicationContext 去获取所有的Bean
    什么是crud?
    new 关键字 和 newInstance() 方法的 区别
    Java反射简单使用--第一次细致阅读底层代码
    动态创建管理定时任务-已完成
    springboot mail整合freemark实现动态生成模板
    20190930开始记录每天学习状态,更新至20200125结束
    hibernate的对象/关系映射结果为空,exists查不到值的问题-20190823
    转载-Java中LinkedList的一些方法—addFirst addFirst getFirst geLast removeFirst removeLast
  • 原文地址:https://www.cnblogs.com/qirutr/p/4656503.html
Copyright © 2020-2023  润新知