求教,这部分代码到底哪里内存泄露了啊?

Lithium 发布于 2013年11月15日 | 更新于 2013年11月17日
无人欣赏。
       __weak AFHTTPRequestOperation *commFriendsRequest = [completedRequests objectAtIndex:1];
        if(!commFriendsRequest.error&&commFriendsRequest.responseData){
            NSDictionary *commDic = [NSJSONSerialization JSONObjectWithData:commFriendsRequest.responseData options:NSJSONReadingMutableContainers error:NULL];//泄露46.2%
            int status1 = [[commDic objectForKey:@"status"]intValue];
            if(status1 == kSuccessCode){
                NSArray *commFriendsArray = [commDic objectForKey:@"data"];
                if(commFriendsArray&&commFriendsArray.count){
                    NSMutableArray *userItems = [NSMutableArray arrayWithCapacity:commFriendsArray.count];//泄露30.8%
                    for(NSDictionary *dic in commFriendsArray){
                        userItem *item = [[userItem alloc]initFromServer:dic];//23.1%
                        [userItems addObject:item];
                    }
                    if(profile){//共同好友与资料都成功
                        profile.commonFriends = userItems;
                        successBlock(profile);
                    }else{
                        if(status0==kSuccessCode){//共同好友
                            successBlock(userItems);
                        }else{
                            NSError *error = [NSError errorWithDomain:kErrorDomain code:status0 userInfo:nil];
                            failedBlock(error);
                        }
                    }
                }else if(status0==kSuccessCode){//无共同好友,有profile
                    successBlock(profile);
                }
            }else{
                if(status0==kSuccessCode){//资料有共同好友失败
                    successBlock(profile);
                }else{//都失败了
                    NSError *error = [NSError errorWithDomain:kErrorDomain code:status1 userInfo:nil];
                    failedBlock(error);
                }
            }
        }else{
            failedBlock(commFriendsRequest.error);
        }

在ARC底下Instruments显示就这么一块泄露,我看了半天不知道哪些的不对。

这块代码是在底下这个block里面的。

[client enqueueBatchOfHTTPRequestOperations:@[profileOperation,commFriendsOperation] progressBlock:^(NSUInteger finished, NSUInteger total){} completionBlock:^(NSArray *completedRequests){
//Code above placed here
}]

Thanks in advance.

共5条回复
hzm0318hzm 回复于 2013年11月15日

目测没有啥泄露啊,我也经常出这问题,莫名其妙的在没有retain的情况下用instruments检测出了泄露,一直没法解决

freecunix 回复于 2013年11月16日

看不出来,而且也不能确保就是这个Block里面的问题。。

最笨最古老的办法:把这段代码单独摘出去,然后用ui动画延时模拟网络请求,在把有信心的代码段一点一点去掉。。。 一定能找出来。

祝你好运。

terryso 回复于 2013年11月16日

我觉得这种问题最好是现在GitHub上建一个可以重现此问题的demo,否则单看代码,没亲身验证的话,很难看出啥问题

Lithium 回复于 2013年11月17日

1楼 @hzm0318hzm

2楼 @freecunix

3楼 @terryso

多谢各位,我也干脆懒得看这块了,几十byte的泄露,先放着。

谢谢@freecunix @terryso 提供的方法,有时间再尝试看看。

langhua9527 回复于 2013年11月17日

用AFN吧。。。

登录 或者 注册