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熟悉。

  • 相关阅读:
    Spring框架(二)
    Spring概况(一)
    唉 规整规整 进阶目录
    网络编程 -- RPC实现原理 -- 目录
    基础大杂烩 -- 目录
    艺多不压身 -- 目录
    延伸 -- 分类 -- 目录
    Eclipse 快捷键
    全局
    深入浅出MySQL++数据库开发、优化与管理维护+第2版+唐汉明 -- 存储引擎
  • 原文地址:https://www.cnblogs.com/qirutr/p/4656503.html
Copyright © 2011-2022 走看看