Gui*_*ume 140 cocoa cocoa-touch retain asihttprequest automatic-ref-counting
在启用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];
// ...
}];
Run Code Online (Sandbox Code Playgroud)
警告与request
块内对象的使用相关联.
Gui*_*ume 164
回复自己:
我对文档的理解是说使用关键字block
并在块中使用后将变量设置为nil应该没问题,但它仍然显示警告.
__block ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:...
[request setCompletionBlock:^{
NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:request.responseData error:nil];
request = nil;
// ....
}];
Run Code Online (Sandbox Code Playgroud)
更新:让它使用关键字'_ weak'而不是' _block',并使用临时变量:
ASIHTTPRequest *_request = [[ASIHTTPRequest alloc] initWithURL:...
__weak ASIHTTPRequest *request = _request;
[request setCompletionBlock:^{
NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:request.responseData error:nil];
// ...
}];
Run Code Online (Sandbox Code Playgroud)
如果您还想要定位iOS 4,请使用__unsafe_unretained
而不是__weak
.相同的行为,但指针保持悬空而不是在对象被销毁时自动设置为nil.
ZaB*_*anc 49
出现此问题是因为您正在为请求分配一个块,该请求具有对其中的请求的强引用.该块将自动保留请求,因此原始请求将不会因循环而解除分配.合理?
这很奇怪,因为您使用__block标记请求对象,因此它可以引用自身.您可以通过创建一个弱引用解决这个问题一起吧.
ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:...];
__weak ASIHTTPRequest *wrequest = request;
[request setCompletionBlock:^{
NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:wrequest.rawResponseData error:nil];
// ...
}];
Run Code Online (Sandbox Code Playgroud)
HDd*_*per 12
它是由于将自我保留在块中而引起的.块将从self访问,self在块中引用.这将创建一个保留周期.
尝试通过创建弱引用来解决这个问题 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];
Run Code Online (Sandbox Code Playgroud)
有时候xcode编译器的标识符有保留周期的问题,所以如果你确定你没有保留completionBlock,你可以放一个像这样的编译器标志:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-retain-cycles"
#pragma clang diagnostic ignored "-Wgnu"
-(void)someMethod {
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
45423 次 |
最近记录: |