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。

TA貢獻2065條經驗 獲得超14個贊
發生此問題的原因是,您正在為要分配的請求分配一個對請求具有強引用的塊。該塊將自動保留請求,因此原始請求不會因為周期而取消分配。說得通?
這很奇怪,因為您正在使用__block標記請求對象,以便它可以引用自身。您可以通過在其旁邊創建一個弱引用來解決此問題。
ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:...];
__weak ASIHTTPRequest *wrequest = request;
[request setCompletionBlock:^{
NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:wrequest.rawResponseData error:nil];
// ...
}];

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];
添加回答
舉報