strong 和 weak的使用

2015-12-03  本文已影响118人  方克己

先举个栗子

例如下面两个button1:@interface ViewController ()
@property (nonatomic,`strong`)UIButton *button1;
@end
@implementation  ViewController
-(UIButton *)button1{  
  if (!_button1) {
  _button1=[UIButton buttonWithType:UIButtonTypeCustom];      
  _button1.frame=CGRectMake(50, 50, 100, 100);        
 [_button1 setTitle:@"第一个
" forState:UIControlStateNormal];_button1.backgroundColor=[UIColor redColor];   }
    return _button1;
}
- (void)viewDidLoad {
    [self.view addSubview:self.button1];
}
@end
2:@interface ViewController ()
@property (nonatomic,`weak`) UIButton *button2;
@end@implementation ViewController
- (void)viewDidLoad {  
  [super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.
   UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];    
   btn.frame=CGRectMake(100, 100, 100, 100); 
   [btn setTitle:@"第二个" forState:UIControlStateNormal];    
   btn.backgroundColor=[UIColor yellowColor];    
   [self.view addSubview:btn]; 
  _button2=btn;}
@end

这里是解释

**我先说下你两个代码的区别,第一个,当button 从试图移除之后不会释放,因为有强引用类型指向它,所以如果不再次释放一下,
这个引用计数就是1第二个,如果从父试图移除,这个button就直接释放了,因为是弱引用,弱引用不对引用计数造成影响

何时使用的问题.如果一个对象在某段时间中反复加载,而你又不希望每次加载都要重新alloc 的话,那就strong,strong 保证对此对象保持一个强引用,对于这个对象,只要有1个strong引用的话,那它就不会释放,当然多个strong同时作用于它也不会释放。

如果一个对象在某段时间只会加载一次,并且加载之后确定不再使用了,那就可以使用weak,这样当其他原因导致引用计数减1(比如 removefromsuperview)的时候,此对象就自动释放了。
无需再在delloc 里面再release一次,但你要保证释放之后确实不再使用此对象,否则将导致错误其实strong和retina的作用有些像,只不过strong 和weak是在arc里面引入的,他俩算是一对儿, 对应关系有点类似 retiam 和assign **

上一篇下一篇

猜你喜欢

热点阅读