什么時候在block中不需要使用weakself
問題
我們知道,在使用block時為了避免循環引用,通常需要使用weakself與strongself,例如:
__weak typeof(self) weakself = self;
self doSomeBlockJob:^{
__strong typeof(weakself) strongSelf = weakself;
if(strongSelf){
........
}
}
那么什么時候在block里調用self,不需要使用weak self呢?
答:在block本身不被self持有,而被別的對象持有,同時不產生循環引用的時候,就不需要使用weakself了.最常見的代碼就是Uiview的動畫代碼,我們在使用Uiview的 animationWithDuration:animation 方法做動畫的時候,並不需要使用weakself ,因為引用持有關系是:
*UIview 的某個負責動畫的對象持有了block
*block本身持有了self
因為self並不持有block,所以就沒有循環引用產生,因此就不需要使用weakself了
[UIview animationWithDuration:0.2 animation:^{
self.alpha=1;
}];
當動畫結束時,UIView會結束持有這個block,如果沒有別的對象持有block的話,block對象就會被釋放掉,從而block會釋放掉隊self的持有,整個內存引用關系被解除.
