先舉個栗子
例如下面兩個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 **