- #import "ViewController.h"
- @interface ViewController ()
- @property (nonatomic, weak) UIView *weakView;
- @property (nonatomic, weak) UIView *selfWeakView;
- @property (nonatomic, strong) UIView *strongView;
- @property (nonatomic, strong) UIView *selfStrongView;
- @end
- @implementation ViewController
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- self.selfStrongView = [[UIView alloc]initWithFrame:CGRectMake(25, 25, 50, 50)];
- printf("self.selfStrongViewretain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfStrongView)));
- [self.view addSubview:self.selfStrongView];
- printf("self.selfStrongView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfStrongView)));
- _strongView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];
- printf("_strongView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_strongView)));
- [self.view addSubview:self.strongView];
- printf("_strongView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_strongView)));
- UIView *selfView = [[UIView alloc]initWithFrame:CGRectMake(150, 150, 50, 50)];
- self.selfWeakView = selfView;
- printf("self.selfWeakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfWeakView)));
- [self.view addSubview:self.selfWeakView];
- printf("self.selfWeakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfWeakView)));
- UIView *weaksView = [[UIView alloc]initWithFrame:CGRectMake(200, 200, 50, 50)];
- printf("weakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(weaksView)));
- _weakView = weaksView;
- printf("_weakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_weakView)));
- [self.view addSubview:_weakView];
- printf("_weakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_weakView)));
- }
- - (void)viewWillAppear:(BOOL)animated
- {
- printf("self.selfStrongView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_strongView)));
- printf("_strongView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_strongView)));
- printf("self.selfWeakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfWeakView)));
- printf("_weakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_weakView)));
- }
- @end
在ARC中,对象释放的最终根据还是根据引用计数为0时去释放。而weak与strong的根本区别是在set方法中,weak的set方法和strong的set方法都是释放旧值保留新值,但是weak的set方法会对其autorelease,即延迟release一次,而strong的set方法也是释放旧值保留新值,但是其不会延迟release。最终效果是strong会+1,weak不会+1.
要注意,用_去赋值的时候是不调用set方法的,也就是说无论weak还是strong,只要用_赋值都不会对引用计数加1,区别在于self.语法会调用set方法,strong的self.会调用set方法+1.而weak的_和self.语法都不会+1.
所以,建议用weak,用weak时无论用_和.语法都不会导致+1。用strong时用self.语法会导致+1.建议用weak。同时weak在对象回收以后可以将对象指针置成nil。