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