先舉個栗子
例如下面兩個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
這里是解釋
**我先說下你兩個代碼的區(qū)別西饵,第一個,當(dāng)button 從試圖移除之后不會釋放眷柔,因為有強引用類型指向它期虾,所以如果不再次釋放一下,
這個引用計數(shù)就是1第二個驯嘱,如果從父試圖移除镶苞,這個button就直接釋放了,因為是弱引用茂蚓,弱引用不對引用計數(shù)造成影響
何時使用的問題.如果一個對象在某段時間中反復(fù)加載,而你又不希望每次加載都要重新alloc 的話煌贴,那就strong,strong 保證對此對象保持一個強引用牛郑,對于這個對象,只要有1個strong引用的話淹朋,那它就不會釋放,當(dāng)然多個strong同時作用于它也不會釋放础芍。
如果一個對象在某段時間只會加載一次杈抢,并且加載之后確定不再使用了仑性,那就可以使用weak,這樣當(dāng)其他原因?qū)е乱糜嫈?shù)減1(比如 removefromsuperview)的時候,此對象就自動釋放了诊杆。
無需再在delloc 里面再release一次,但你要保證釋放之后確實不再使用此對象晨汹,否則將導(dǎo)致錯誤其實strong和retina的作用有些像,只不過strong 和weak是在arc里面引入的剥扣,他倆算是一對兒, 對應(yīng)關(guān)系有點類似 retiam 和assign **