//
// MKRequest.m
// testNet
//
// Created by nwwl on 13-11-26.
// Copyright (c) 2013年 nwwl. All rights reserved.
//
#import "MKRequest.h"
#import "MKNetworkEngine.h"
@interface MKRequest(){
MKNetworkOperation *op;
}
@end
@implementation MKRequest
- (void)dealloc{
DLog(@"dealloc mk!");
}
//初始化
- (id)init
{
if (self = [super init]) {
}
return self;
}
//异步请求方式
- (void)startRequestMethod:(NSString *)url //请求url
params:(NSDictionary *)params //参数
fieldParams:(NSDictionary *)fieldParams //文件参数
requestMethod:(NSString *)method //请求方法
onCompletion:(RequestCompletionBlocks)onCompletion
onError:(RequestFailedBlocks)onError{
MKNetworkEngine *engine = [[MKNetworkEngine alloc] init];
if ([method isEqualToString:kPOST]) {
op = [engine operationWithURLString:url params:params httpMethod:@"POST"];
if ([self.fileType isEqualToString:kDataType]) {
[op setFreezable:YES]; //冻结操作 当网络不存在时 恢复网络时 自动执行
//对于Data的post请求
for (NSString *key in [fieldParams keyEnumerator])
{
[op addData:[fieldParams valueForKey:key] forKey:key];
}
}else if([self.fileType isEqualToString:kDataType]){
[op setFreezable:YES]; //冻结操作 当网络不存在时 恢复网络时 自动执行
//对于文件的post请求
for (NSString *key in [fieldParams keyEnumerator])
{
[op addFile:[fieldParams valueForKey:key] forKey:key];
}
}
}else if ([method isEqualToString:kGET]){
op = [engine operationWithURLString:url params:params httpMethod:@"GET"];
}
[op addCompletionHandler:^(MKNetworkOperation *operation) {
NSError *error = nil;
id jsonObject = [NSJSONSerialization JSONObjectWithData:[[operation responseString] dataUsingEncoding:NSUnicodeStringEncoding] options:NSJSONReadingMutableLeaves error:&error];
if ([jsonObject isKindOfClass:[NSDictionary class]]){
NSDictionary *deserializedDictionary = (NSDictionary *)jsonObject;
onCompletion(deserializedDictionary);
} else if ([jsonObject isKindOfClass:[NSArray class]]){
NSArray *deserializedArray = (NSArray *)jsonObject;
onCompletion(deserializedArray);
} else {
NSLog(@"An error happened while deserializing the JSON data.");
}
}errorHandler:^(MKNetworkOperation *errorOp, NSError* err) {
NSLog(@"MKNetwork request error : %@", [err localizedDescription]);
onError(err);
}];
// [op onUploadProgressChanged:^(double progress) {
// DLog(@"%.2f", progress*100.0);
// }];
[engine enqueueOperation:op];
}
//取消当前请求
- (void)cancelRequest{
[op cancel];
}
@end
MKHttpRequest.m 继承requet请求类
//
// MKHttpRequest.m
// testNet
//
// Created by nwwl on 13-11-26.
// Copyright (c) 2013年 nwwl. All rights reserved.
//
#import "MKHttpRequest.h"
@implementation MKHttpRequest
//post请求
- (void)requestPost:(NSString *)url //请求url
params:(NSDictionary *)params //参数
onCompletion:(RequestCompletionBlocks)onCompletion
onError:(RequestFailedBlocks)onError{
[self startRequestMethod:url
params:params
fieldParams:nil
requestMethod:kPOST
onCompletion:^(id result) {
onCompletion(result);
} onError:^(NSError *error) {
onError(error);
}];
}
//post请求 带data
- (void)requestDataPost:(NSString *)url //请求url
params:(NSDictionary *)params //参数
fieldParams:(NSDictionary *)fieldParams //图片参数
onCompletion:(RequestCompletionBlocks)onCompletion
onError:(RequestFailedBlocks)onError{
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
UIImage *image = [UIImage imageNamed:@"prople.png"];
NSData *imageData = UIImagePNGRepresentation(image);
[dict setObject:imageData forKey:@"image"];
self.fileType = kDataType;
[self startRequestMethod:url
params:params
fieldParams:dict
requestMethod:kPOST
onCompletion:^(id result) {
onCompletion(result);
} onError:^(NSError *error) {
onError(error);
}];
}
//post请求 带file
- (void)requestFilePost:(NSString *)url //请求url
params:(NSDictionary *)params //参数
fieldParams:(NSDictionary *)fieldParams //图片参数
onCompletion:(RequestCompletionBlocks)onCompletion
onError:(RequestFailedBlocks)onError{
self.fileType = kFieldType;
[self startRequestMethod:url
params:params
fieldParams:fieldParams
requestMethod:kPOST
onCompletion:^(id result) {
onCompletion(result);
} onError:^(NSError *error) {
onError(error);
}];
}
//get请求
- (void)requestGet:(NSString *)url //请求url
onCompletion:(RequestCompletionBlocks)onCompletion
onError:(RequestFailedBlocks)onError{
[self startRequestMethod:url
params:nil
fieldParams:nil
requestMethod:kGET
onCompletion:^(id result) {
onCompletion(result);
} onError:^(NSError *error) {
onError(error);
}];
}
@end
再测试vc中 使用
__block MkViewController *controller = self; //防止在block中用到self时把self对象retain, 造成内存泄露。
[self.request getCurrentData:@"" onCompletion:^(id result) {
// DLog(@"result :%@",result);
NSMutableArray *array = [result valueForKey:@"park_list"];
DLog(@"array :%d",array.count);
controller.saveArray = array;
} onError:^(NSError *error) {
}];
如果 使用controller.saveArray = array; 就会造成内存不释放
不使用 controller.saveArray = array; 就完全没问题
也就是说 只要有值接受了 block中的值 内存不释放
研究了两天 查了下资料 才发现
在ARC下,默认的指针都是__strong属性。这意味着一个对象赋值给另外一个指针,那么只要指针参考了该对象,该对象就会一直保持。这对于大部分对象都实用,但是这可能会导致retain cycle。例如,你拥有一个对象包含了另外了一个实例变量对象,但是第二个对象又把前一个对象作为它的委托,那么这两个对象将不会被释放。
对于__weak,当释放指针指向的对象时,该对象的指针将转换为nil 是一种比较安全的行为
后来再MKRequest.m中 修改如下
@interface MKRequest(){
__weak MKNetworkOperation *op;
}
@end
问题成功解决!