在Objective-C逐渐进入ARC时代后,我们已经不用手动去retain,release来对对象进行管理了,但是我们需要面对strong,weak这两个关键字来对对象的持有关系进行确定。
其实strong和weak的意义和使用都十分简单
1. strong 表示的是从属关系,引用对象持有被引用的对象
2.weak则暗示不具备从属关系
首先我们需要知道,当一个对象只有在它没有从属于任何对象时,它才会被ARC给释放掉。
我们这样来想,假如所有对象之间的持有都是strong的,那么当对象之间的持有关系如图1,那么B,C,D之间相互持有,无法被释放掉,这就形成了内存泄漏。所以,为了解决这个问题,我们将B和D之间的关系改为weak,表明B并不从属于D,那么当A被释放掉时,B也被释放掉,C,D都会被释放掉。这样,就不会内存泄漏了。
图1
下面是使用weak的几个常见的情况
1. 在应用程序委托中使用weak
@property(weak, nonatomic) id delegate
2. 在对nib文件的uikit界面组件IBOutlet的引用时
3. 在block中对自身self的引用。因为block对捕捉的变量构成强引用。
__block typeof(self) weakself=self;
[self testBlock:^{
[weakself doSomething];
}];