前言
weak弱引用骗绕,前面提到了,沒有深入寫资昧,參考iOS深入學(xué)習(xí)之Weak關(guān)鍵字介紹這篇文章寫一點(diǎn)酬土,對于文章的后半部分weak如何置為nil,在以后在補(bǔ)充吧格带。
正文
weak代表弱引用撤缴,特點(diǎn)是不決定對象內(nèi)存釋放。
直接上代碼吧
@property (nonatomic,strong)id strongPoint;
@property (nonatomic,weak)id weakPoint;
self.strongPoint = [UILabel new];
self.weakPoint = self.strongPoint;
self.strongPoint = nil;
NSLog(@"result is :%@", self.weakPoint);
//打印
textview[5766:1480577] result is :(null)
strongPoint是強(qiáng)引用的指針叽唱,此處兩個(gè)指針同時(shí)指向一個(gè)對象屈呕,當(dāng)strongPoint不再指向?qū)ο髸r(shí),對象內(nèi)存釋放棺亭,weakPoint指向nil虎眨,但是如果wakPoint也是強(qiáng)引用就會打印如下
textview[5794:1482166] result is :<UILabel: 0x7ffab2511a70; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x608000282c60>>
因?yàn)閷ο筮€有強(qiáng)指針指向,所以不會釋放
那么一個(gè)奇怪的事情就會發(fā)生了
@property (nonatomic,strong)id strongPoint;
@property (nonatomic,weak)id weakPoint;
self.strongPoint = [NSString stringWithFormat:@"notStrong"];
self.weakPoint = self.strongPoint;
self.strongPoint = nil;
NSLog(@"result is :%@", self.weakPoint);
//打印
textview[5814:1483779] result is :notStrong
設(shè)置為NSString之后镶摘,即使被釋放了嗽桩,也能不打印nil。
原因呢可以看一下這篇文章被__weak修飾的NSString凄敢。
我就直接寫結(jié)論了(@""碌冶、initWithString、stringWithFormat)聲明時(shí)它是常量字符串涝缝,沒有retainCount(引用計(jì)數(shù))扑庞,沒有強(qiáng)指針指向它譬重,存在內(nèi)存靜態(tài)區(qū),不會被銷毀嫩挤,輸出自然會有結(jié)果害幅。
(initWithFormat)聲明不是常量字符串。