我们先来看如下代码:
MyViewController *myController = [[MyViewController alloc] init…];// 隐式地调用[myController retain];造成循环引用
myController.completionHandler = ^(NSInteger result) {
[myController dismissViewControllerAnimated:YES completion:nil];
};
[self presentViewController:myController animated:YES completion:^{
[myController release]; // 注意,这里调用[myController release];是在MRC中的一个常规写法,并不能解决上面循环引用的问题
}];
【分析】MyViewController 持 有completionHandler ,而completionHandler 因为也使用了MyViewController对象,所以也会retain一个MyViewController
这就造成了循环引用。
本质原因是这样:在ARC下,completionHandler 使用MyViewController,相当于复制一份MyViewController的引用到block下当成员变量。所以才造成循环引用。
在MRC下解决办法是:
yViewController * __block myController = [[MyViewController alloc] init…]; // ... myController.completionHandler = ^(NSInteger result) { [myController dismissViewControllerAnimated:YES completion:nil]; }; //之后正常的release或者retain
【__block的作用】: