使用blcok 造成内存不释放 解决办法

最近再研究 mk这个网络请求类库  发现很好用 就准备把他封装成一个方法 供以后使用 

MKRequest.m  基础request请求类

//

//  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];   //冻结操作 当网络不存在时  恢复网络时 自动执行

            //对于Datapost请求

            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


问题成功解决!




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值