亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在啟用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條經驗 獲得超14個贊

發生此問題的原因是,您正在為要分配的請求分配一個對請求具有強引用的塊。該塊將自動保留請求,因此原始請求不會因為周期而取消分配。說得通?


這很奇怪,因為您正在使用__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 關注
  • 699 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號