Ios 内存被多次点击屏幕、网络泄漏,导致实际设备崩溃

Ios 内存被多次点击屏幕、网络泄漏,导致实际设备崩溃,ios,memory,memory-leaks,instruments,Ios,Memory,Memory Leaks,Instruments,当用户测试我的应用程序时,他像猴子一样很快地随机点击屏幕,进入我的每个细节查看控制器,因为每个进入我的细节vc,vc将从网上获取数据。在真实设备中,我的应用程序崩溃。 我认为这个问题是由内存泄漏引起的,因为它没有出现在模拟器中,我在仪器中测试我的应用程序,下面是屏幕截图: 在文书中: 情况: 在我的主屏幕上,单击主屏幕上的每个项目,将显示不同的详细信息vc 详细说明一个vc,每个详细说明vc,用户测试将获取数据或单击随机: 内存增长到90.5MB,并且没有下降,如果使用用户的测试方法,如果需

当用户测试我的应用程序时,他像猴子一样很快地随机点击屏幕,进入我的每个细节
查看控制器
,因为每个进入我的细节
vc
,vc将
从网上获取数据。在真实设备中,我的应用程序崩溃。
我认为这个问题是由
内存泄漏
引起的,因为它没有出现在
模拟器
中,我在
仪器
中测试我的应用程序,下面是
屏幕截图

在文书中:

情况:

  • 在我的主屏幕上,单击主屏幕上的每个
    项目
    ,将显示不同的详细信息
    vc

  • 详细说明一个
    vc
    ,每个详细说明
    vc
    ,用户测试将
    获取数据
    或单击随机:

  • 内存增长到
    90.5MB
    ,并且没有下降,如果使用用户的测试方法,如果需要更长的时间,将超过
    90.5MB

  • 我使用的
    仪器
    不是很好,而且内存是
    AFNetworking
    使用最多的,我不知道该怎么做。有人能给出建议吗?非常感谢

    编辑

    我将
    AFHTTPSessionManager
    设置为
    singleton
    ,但我发现我的网络请求变慢了,这会影响我吗

    #import "Mysevers.h"
    #import "AFNetworking.h"
    #import "HUD.h"
    
    
    static AFHTTPSessionManager *requestManager ;
    
    @implementation Mysevers
    
    + (AFHTTPSessionManager *)sharedHTTPSession{
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            requestManager = [AFHTTPSessionManager manager];
            requestManager.requestSerializer.timeoutInterval = 10;
        });
        return requestManager;
    }
    
    
    +(void)AFPOSTWithHud:(BOOL)hud andAddressname:(NSString*)addressName parmas:(NSDictionary*)parmas RequestSuccess:(void(^)(id result))success failBlcok:(void(^)(void))failBlcok
    {
    
        if (hud) {
            //[HUD addHUD];
        
            [SVProgressHUD show];
        }
    
        AFHTTPSessionManager *requestManager = [Mysevers sharedHTTPSession];
    
        NSString *urlStr = [NSString stringWithFormat:@"%@%@",BASE_URL,addressName];
        DLog(@"%@",urlStr);
    
        [requestManager POST:urlStr parameters:parmas progress:^(NSProgress * _Nonnull uploadProgress) {
        
     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            if (hud) {
                //[HUD removeHUD];
                [SVProgressHUD dismiss];
            }
            success(responseObject);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
            if (error != nil) {
                DLog(@"error==%@",[error localizedDescription]);
                if (hud) {
                    //[HUD removeHUD];
                    [SVProgressHUD dismiss];
                }
                failBlcok();
            }
        
        
            return ;
        }];
    
    
    }
    
    
    +(void)AFGETWithHud:(BOOL)hud andAddressname:(NSString*)addressName parmas:(NSDictionary*)parmas RequestSuccess:(void(^)(id result))success failBlcok:( void(^)(void))failBlcok
    {    
        if (hud) {
            //[HUD addHUD];
            [SVProgressHUD show];
        }
        AFHTTPSessionManager *requestManager = [Mysevers sharedHTTPSession];
    
        NSString *urlStr = [NSString stringWithFormat:@"%@%@",BASE_URL,addressName];
    
        DLog(@"%@",urlStr);
    
    
        [requestManager GET:urlStr parameters:parmas progress:^(NSProgress * _Nonnull downloadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
            if (hud) {
    
                //[HUD removeHUD];
                [SVProgressHUD dismiss];
            }
            success(responseObject);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            DLog(@"error==%@",[error localizedDescription]);
        
            if (hud) {
                //[HUD removeHUD];
                [SVProgressHUD dismiss];
            }
            failBlcok();
        }];
    }
    
    
    @end
    

    如果您正在实例化大量新的
    NSURLSession
    对象,您将看到这种行为(即,如果您实例化大量
    AFHTTPSessionManager
    对象,将会发生这种情况)

    例如,我编写了一个简单的程序,实例化了50个独立的
    nsursession
    对象,为每个对象执行一个简单的数据任务(由下面“兴趣点”下的“标志柱”指定,所有这些都发生在绿色条指示的区域内),然后立即释放它们

    您将看到内存增加了近6mb,但在大约2分钟后(我完全没有干预),它只开始回收内存,返回了以前所有会话对象消耗的超过一半的内存。这是我在发布多个会话对象时看到的可复制模式

    这可以通过调用
    NSURLSession
    对象上的
    finishtasks和invalidate
    来解决,或者,更好的方法是,确保您的应用程序只实例化一个会话对象,然后每次都使用相同的会话对象。这两种方法中的任何一种都将显著减少应用程序的内存配置文件(并且重用同一会话对象更有效)

    简而言之,我会确保您的详细视图控制器不会每次都实例化一个新的
    AFHTTPSessionManager
    对象。在应用程序中实例化一次并重用它


    话虽如此,我想知道您是否还存在其他一些内存问题,因为我的50
    NSURLSession
    对象只消耗了6mb的内存,而且听起来您损失的还不止这些。因此,我建议修复上面的问题,但是如果您仍然看到内存消耗在增加(尽管不再需要在泄漏中显示),那么您可能有一些强引用循环之类的问题。Xcode 8“调试内存图”工具(请参阅)有助于跟踪这些问题。

    如果实例化大量新的
    nsursession
    对象(即,如果实例化大量
    AFHTTPSessionManager
    对象,就会出现这种情况)

    例如,我编写了一个简单的程序,实例化了50个独立的
    nsursession
    对象,为每个对象执行一个简单的数据任务(由下面“兴趣点”下的“标志柱”指定,所有这些都发生在绿色条指示的区域内),然后立即释放它们

    您将看到内存增加了近6mb,但在大约2分钟后(我完全没有干预),它只开始回收内存,返回了以前所有会话对象消耗的超过一半的内存。这是我在发布多个会话对象时看到的可复制模式

    这可以通过调用
    NSURLSession
    对象上的
    finishtasks和invalidate
    来解决,或者,更好的方法是,确保您的应用程序只实例化一个会话对象,然后每次都使用相同的会话对象。这两种方法中的任何一种都将显著减少应用程序的内存配置文件(并且重用同一会话对象更有效)

    简而言之,我会确保您的详细视图控制器不会每次都实例化一个新的
    AFHTTPSessionManager
    对象。在应用程序中实例化一次并重用它


    话虽如此,我想知道您是否还存在其他一些内存问题,因为我的50
    NSURLSession
    对象只消耗了6mb的内存,而且听起来您损失的还不止这些。因此,我建议修复上面的问题,但是如果您仍然看到内存消耗在增加(尽管不再需要在泄漏中显示),那么您可能有一些强引用循环之类的问题。Xcode 8“调试内存图”工具(请参阅)有助于跟踪这些问题。

    @Rob非常感谢Rob,我想知道,每次来到
    详细vc
    ,我都会请求网络使用
    AFNetworking
    ,如果我返回main
    vc
    ,如果
    AFHTTPSessionManager
    详细vc
    中被杀死?或者如果没有,我现在就来到
    细节vc
    请求网络,如果在那里我创建了2个
    AFHTTPSessionManager
    ?是的,如果你在细节vc内部实例化你的
    AFHTTPSessionManager
    ,但没有在任何地方保存对它的引用,是的,每次都会创建一个新的。最好将引用保存在某个地方(例如,在顶层视图控制器上实例化并传递它,或者让一些单例保持跟踪)