UI控件用weak还是用strong修饰

  1. #import "ViewController.h"  
  2.   
  3. @interface ViewController ()  
  4. @property (nonatomic, weak) UIView *weakView;  
  5. @property (nonatomic, weak) UIView *selfWeakView;  
  6. @property (nonatomic, strong) UIView *strongView;  
  7. @property (nonatomic, strong) UIView *selfStrongView;  
  8. @end  
  9.   
  10. @implementation ViewController  
  11.   
  12. - (void)viewDidLoad  
  13. {  
  14.     [super viewDidLoad];  
  15.     self.selfStrongView = [[UIView alloc]initWithFrame:CGRectMake(25, 25, 50, 50)];  
  16.     printf("self.selfStrongViewretain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfStrongView)));  
  17.     [self.view addSubview:self.selfStrongView];  
  18.     printf("self.selfStrongView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfStrongView)));  
  19.       
  20.     _strongView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];  
  21.     printf("_strongView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_strongView)));  
  22.     [self.view addSubview:self.strongView];  
  23.     printf("_strongView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_strongView)));  
  24.   
  25.     UIView *selfView = [[UIView alloc]initWithFrame:CGRectMake(150, 150, 50, 50)];  
  26.     self.selfWeakView = selfView;  
  27.     printf("self.selfWeakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfWeakView)));  
  28.     [self.view addSubview:self.selfWeakView];  
  29.     printf("self.selfWeakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfWeakView)));  
  30.       
  31.     UIView *weaksView = [[UIView alloc]initWithFrame:CGRectMake(200, 200, 50, 50)];  
  32.     printf("weakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(weaksView)));  
  33.     _weakView = weaksView;  
  34.     printf("_weakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_weakView)));  
  35.     [self.view addSubview:_weakView];  
  36.     printf("_weakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_weakView)));  
  37. }  
  38.   
  39. - (void)viewWillAppear:(BOOL)animated  
  40. {  
  41.     printf("self.selfStrongView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_strongView)));  
  42.     printf("_strongView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_strongView)));  
  43.     printf("self.selfWeakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfWeakView)));  
  44.     printf("_weakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_weakView)));  
  45. }  
  46. @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。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值