前言
weak弱引用,前面提到了,没有深入写,参考iOS深入学习之Weak关键字介绍这篇文章写一点,对于文章的后半部分weak如何置为nil,在以后在补充吧。
正文
weak代表弱引用,特点是不决定对象内存释放。
直接上代码吧
@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是强引用的指针,此处两个指针同时指向一个对象,当strongPoint不再指向对象时,对象内存释放,weakPoint指向nil,但是如果wakPoint也是强引用就会打印如下
textview[5794:1482166] result is :<UILabel: 0x7ffab2511a70; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x608000282c60>>
因为对象还有强指针指向,所以不会释放
那么一个奇怪的事情就会发生了
@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
设置为NSString之后,即使被释放了,也能不打印nil。
原因呢可以看一下这篇文章被__weak修饰的NSString。
我就直接写结论了(@""、initWithString、stringWithFormat)声明时它是常量字符串,没有retainCount(引用计数),没有强指针指向它,存在内存静态区,不会被销毁,输出自然会有结果。
(initWithFormat)声明不是常量字符串。
网友评论