__strong 和 __weak
id obj1 = [[NSObject alloc] init]; 和 id __strong obj1 = [[NSObjectalloc] init];他倆是等價的
這里雖然沒有顯示的聲明為__strong,但是Objective-C默認聲明的一個對象就為__strong,
在強引用中,有時候會出現循環引用的情況,這時候需要弱引用__weak.強引用持有對象,弱引用不持有對象。
強引用可以釋放對象,弱引用不可以,因為弱引用不持有對象,當弱引用指向一個強引用所持有的對象是,當強引用對象釋放掉以后,弱引用會自動被賦值為nil,即弱引用會自動的指向nil。
舉個例子:
#pragma mark ------強引用和弱引用-------
-(void)weakOrStrong{
id __weak obj0;
if(YES) {
idobj1 = [[NSObjectalloc]init];
obj0 = obj1;
NSLog(@"obj0: %@",obj0);
}
NSLog(@"obj0: %@",obj0);
}
運行結果如下:
NewCocoTest[2759:109430] obj0:
2017-02-20 13:58:58.331 NewCocoTest[2759:109430] obj0: (null)
因為obj1生成的默認的為強引用(__strong),在超出if的作用域之后,obj1所持有的對象被釋放,
*? obj0為弱引用,所以obj0不持有對象,在obj1對象釋放后,obj0自動的被賦值為nil
*? 弱引用的特性是,不持有對象,即便是寫成id __weak obj1 = [[NSObject alloc] init];
*? 此代碼系統會給與警告,因為這里obj1被聲明成弱引用,那么在賦值之后,alloc出來的對象會被立即釋放。
//當產生的對象直接用弱引用來接手時,直接就釋放掉了
#pragma mark ------強引用和弱引用-------
-(void)weakOrStrong{
id __weak obj0;
if(YES) {
id__weakobj1 = [[NSObjectalloc]init];//會出現警告
NSLog(@"obj1====%@",obj1);
obj0 = obj1;
NSLog(@"obj0: %@",obj0);
}
NSLog(@"obj0: %@",obj0);
}
//運行結果如下
NewCocoTest[2823:112254] obj1====(null)
2017-02-20 14:02:42.521 NewCocoTest[2823:112254] obj0: (null)
2017-02-20 14:02:42.522 NewCocoTest[2823:112254] obj0: (null)