强引用和弱引用

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

原文地址:https://www.cnblogs.com/qirutr/p/4656503.html