首先在头文件中定义2个实例变量
@interface EGOClass
{
EGOViewController *_egoViewCtrl;
EGOData *_egoData;
}
在.m文件中实现方法,方法中包含代码块
- (void)doSomething
{
_egoViewCtrl = [[EGOViewController alloc] init];
[_egoViewCtrl startWithCompletionHandler:^(NSData *data)
{
_egoData = data ;
}];
}
这段代码中存在了保留环,因为_egoViewCtrl实例变量保留了代码块,而在块中又保留了_egoData实例。导致delloc方法不会被调用,实例变量无法释放。ARC有下列解决方法:
1.
- (void)doSomething
{
EGOViewController *egoViewCtrl = [[EGOViewController alloc] init];
[egoViewCtrl startWithCompletionHandler:^(NSData *data)
{
_egoData = data ;
}];
}
2.
- (void)doSomething
{
__weak typeOf weakSelf = self;
_egoViewCtrl = [[EGOViewController alloc] init];
[_egoViewCtrl startWithCompletionHandler:^(NSData *data)
{
weakSelf.egoData = data ;
}];
}
3.
- (void)doSomething
{
_egoViewCtrl = [[EGOViewController alloc] init];
[_egoViewCtrl startWithCompletionHandler:^(NSData *data)
{
_egoData = data ;
_egoViewCtrl = nil;
}];
}
在非ARC模式下:
- (void)doSomething
{
__block id safeSelf = self;
_egoViewCtrl = [[EGOViewController alloc] init];
[_egoViewCtrl startWithCompletionHandler:^(NSData *data)
{
safeSelf.egoData = data ;
}];
}