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
对象。在应用程序中实例化一次并重用它
话虽如此,我想知道您是否还存在其他一些内存问题,因为我的50NSURLSession
对象只消耗了6mb的内存,而且听起来您损失的还不止这些。因此,我建议修复上面的问题,但是如果您仍然看到内存消耗在增加(尽管不再需要在泄漏中显示),那么您可能有一些强引用循环之类的问题。Xcode 8“调试内存图”工具(请参阅)有助于跟踪这些问题。如果实例化大量新的nsursession
对象(即,如果实例化大量AFHTTPSessionManager
对象,就会出现这种情况)
例如,我编写了一个简单的程序,实例化了50个独立的nsursession
对象,为每个对象执行一个简单的数据任务(由下面“兴趣点”下的“标志柱”指定,所有这些都发生在绿色条指示的区域内),然后立即释放它们
您将看到内存增加了近6mb,但在大约2分钟后(我完全没有干预),它只开始回收内存,返回了以前所有会话对象消耗的超过一半的内存。这是我在发布多个会话对象时看到的可复制模式
这可以通过调用NSURLSession
对象上的finishtasks和invalidate
来解决,或者,更好的方法是,确保您的应用程序只实例化一个会话对象,然后每次都使用相同的会话对象。这两种方法中的任何一种都将显著减少应用程序的内存配置文件(并且重用同一会话对象更有效)
简而言之,我会确保您的详细视图控制器不会每次都实例化一个新的AFHTTPSessionManager
对象。在应用程序中实例化一次并重用它
话虽如此,我想知道您是否还存在其他一些内存问题,因为我的50NSURLSession
对象只消耗了6mb的内存,而且听起来您损失的还不止这些。因此,我建议修复上面的问题,但是如果您仍然看到内存消耗在增加(尽管不再需要在泄漏中显示),那么您可能有一些强引用循环之类的问题。Xcode 8“调试内存图”工具(请参阅)有助于跟踪这些问题。@Rob非常感谢Rob,我想知道,每次来到详细vc
,我都会请求网络使用AFNetworking
,如果我返回mainvc
,如果AFHTTPSessionManager
在详细vc
中被杀死?或者如果没有,我现在就来到细节vc
请求网络,如果在那里我创建了2个AFHTTPSessionManager
?是的,如果你在细节vc内部实例化你的AFHTTPSessionManager
,但没有在任何地方保存对它的引用,是的,每次都会创建一个新的。最好将引用保存在某个地方(例如,在顶层视图控制器上实例化并传递它,或者让一些单例保持跟踪)