为了账号安全,请及时绑定邮箱和手机立即绑定

在启用ARC的代码中修复警告“在此块中强烈捕获[对象]可能会导致保留周期”

在启用ARC的代码中修复警告“在此块中强烈捕获[对象]可能会导致保留周期”

皈依舞 2019-12-13 09:49:16
在启用ARC的代码中,当使用基于块的API时,如何解决有关潜在保留周期的警告?警告:Capturing 'request' strongly in this block is likely to lead to a retain cycle由以下代码段生成:ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:...[request setCompletionBlock:^{    NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:request.rawResponseData error:nil];    // ...    }];警告与request块内对象的使用有关。
查看完整描述

3 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

回复自己:


我对文档的理解是,在模块中使用关键字block并将变量设置为nil后应该可以,但是仍然显示警告。


__block ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:...


[request setCompletionBlock:^{

    NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:request.responseData error:nil];

    request = nil;

// ....


    }];

更新:使它可以使用关键字“ _weak” 而不是“ _block”,并使用一个临时变量:


ASIHTTPRequest *_request = [[ASIHTTPRequest alloc] initWithURL:...

__weak ASIHTTPRequest *request = _request;


[request setCompletionBlock:^{

    NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:request.responseData error:nil];

    // ...

    }];

如果您也要定位iOS 4,请使用__unsafe_unretained代替__weak。行为相同,但是当对象被破坏时,指针保持悬空状态,而不是自动设置为nil。


查看完整回答
反对 回复 2019-12-13
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

发生此问题的原因是,您正在为要分配的请求分配一个对请求具有强引用的块。该块将自动保留请求,因此原始请求不会因为周期而取消分配。说得通?


这很奇怪,因为您正在使用__block标记请求对象,以便它可以引用自身。您可以通过在其旁边创建一个弱引用来解决此问题。


ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:...];

__weak ASIHTTPRequest *wrequest = request;


[request setCompletionBlock:^{

    NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:wrequest.rawResponseData error:nil];

    // ...

    }];


查看完整回答
反对 回复 2019-12-13
?
慕斯王

TA贡献1864条经验 获得超2个赞

这是由于将自身保留在块中引起的。块将从self访问,并且self在block中被引用。这将创建一个保留周期。


尝试通过创建弱引用来解决此问题 self


__weak typeof(self) weakSelf = self;


operationManager = [[AFHTTPRequestOperation alloc] initWithRequest:request];

operationManager.responseSerializer = [AFJSONResponseSerializer serializer];

[operationManager setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {


    [weakSelf requestFinishWithSucessResponseObject:responseObject withAFHTTPRequestOperation:operation andRequestType:eRequestType];


} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    [weakSelf requestFinishWithFailureResponseObject:error withAFHTTPRequestOperation:operation andRequestType:eRequestType];

}];

[operationManager start];


查看完整回答
反对 回复 2019-12-13
  • 3 回答
  • 0 关注
  • 643 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信