先举个栗子
例如下面两个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 **
网友评论