我有一个NetworkManager类,它执行连接到基于JSON的Web服务并返回服务器响应的任务。我正在使用完成处理程序块来从NetworkManager返回成功或错误响应(在内部,NetworkManager使用基于委托的NSURLConnection)。
NetworkManager *objNetworkManager= [[NetworkManager alloc]init];
[objNetworkManager setCompletionHandler:^(NSDictionary *resp, BOOL isSuccess){
if (isSuccess) {
}else{
}
}];
[objNetworkManager initiateUrlRequestWithInput:jsonRequestInput];
现在一切正常,我的网络请求使用此NetworkManager类按预期工作。我担心的是每次进行Web服务调用时,我都会分配一个NetworkManager实例。但是,我应该在哪里将objNetworkManager设置为nil?因为它使用块回调,我不确定如何有效地处理内存。请指教!!
答案 0 :(得分:2)
以下是我对此的看法:
如果您没有创建参考周期或任何泄漏,ARC会自动为您处理。例如,如果VC1实例化了NetworkManager并且发布了所有内容,那么您将退出VC1并取消分配,然后将取消分配NetworkManager引用。
如果您真的想要主动发布NetworkManager,那么您可以在成功和错误完成块中执行此操作。我就这样做:)。
编辑:示例:
__weak MyViewController *aBlockSelf = self;
// Save User Preferences (/ics/markavailable)
self.requestHandler = [[MyRequestHandler alloc] initWithEndPoint:@"/fetch/request" body:aBodyData container:self.navigationController.view loadingOverlayTitle:@"Loading..." successHandler:^(NSDictionary *iResponse) {
// Do success handling
aBlockSelf.requestHandler = nil;
} andErrorHandler:^(NSString *iMessage, NSString *iKey, NSInteger iErrorCode, BOOL iIsNetworkError) {
// Do success handling
aBlockSelf.requestHandler = nil;
}];
[self.requestHandler executeRequest];
要了解保留周期,请查看this thread。
答案 1 :(得分:0)
如果可以同时调用Web服务,则可以在公共数据中使用NSMutableArray来保存管理器。
//Public data manager class add a NSMutableArray to save managers.
@property (nonatomic, strong) NSMutableArray *requestingManager;
NetworkManager *objNetworkManager= [[NetworkManager alloc]init];
[objNetworkManager setCompletionHandler:^(NSDictionary *resp, BOOL isSuccess){
//remove when finish
[[PublicData instance].requestingManager removeObject:objNetworkManager];
if (isSuccess) {
}else{
}
}];
[objNetworkManager initiateUrlRequestWithInput:jsonRequestInput];
//add manager when request
[[PublicData instance].requestingManager addObject:objNetworkManager];
删除objNetworkManager后,objNetworkManager将不会保留,并且会释放,其中的块将自动设置为nil。