id="iframeu1788635_0" src="http://pos.baidu.com/qcmm?rdid=1788635&dc=2&exps=112004&di=u1788635&dri=0&dis=0&dai=2&ps=236x797&dcb=BAIDU_SSP_define&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1473752217517&ti=%E5%A4%84%E7%90%86block%E4%B8%AD%E8%B0%83%E7%94%A8%E5%AF%B9%E8%B1%A1%E5%AE%9E%E4%BE%8B%E5%8F%98%E9%87%8F%E5%AF%BC%E8%87%B4%E7%9A%84%E5%BE%AA%E7%8E%AF%E5%BC%95%E7%94%A8%20%7C%20%E5%AD%A6%E6%AD%A5%E5%9B%AD&ari=2&dbv=0&drs=1&pcs=1143x822&pss=1143x256&cfv=22&cpl=5&chi=1&cce=true&cec=UTF-8&tlm=1473723417&rw=822<u=http%3A%2F%2Fwww.xuebuyuan.com%2F2067323.html<r=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DKchERxMaR02zwhDPy3MLcHjxPdGJWiFkjQdYv1WKGJjbP2D3LwYl7hIvnKE9nBeI%26wd%3D%26eqid%3Ddcf0305c0001b8220000000457d7ac53&ecd=1&psr=1920x1080&par=1920x977&pis=-1x-1&ccd=24&cja=true&cmi=8&col=zh-cn&cdo=-1&tcn=1473752218&qn=95ac3c87ff7b9df4&tt=1473752217497.39.248.248" width="336" height="280" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="margin: 0px; padding: 0px; border-width: 0px; background-color: transparent; vertical-align: bottom;">
在传入block的类的dealloc方法中加断点后,dealloc方法没有被调用,确认如果在block中直接引用对象的实例变量也会引起循环引用。比较常规的解决办法就是用weak self + property的方式解决。但是个人一直觉得属性是用来向外公开的,类内部用的变量不应该用属性的方式实现。所以折腾了半天,有了以下的解决方案:
@interface TestVC (){
BOOL _isToOuter;
}
@end
@implementation TestVC
-(void)test{
NeedABlockObj* obj=[[NeedABlockObj alloc] init];
__typeof (&*self) __weak weakSelf = self;
obj.aBlock = ^(int to){
//不把weak 转为strong,则无法编译通过。
__typeof (&*self) strongSelf = weakSelf;
strongSelf->_isToOuter = YES;
};
}
@end