【发布时间】:2017-04-09 12:29:36
【问题描述】:
当用户测试我的应用程序时,他像猴子一样快速随机点击屏幕,进入我的每一个细节view controller,因为每一个进入我的细节vc,vc 将来自fetch data网。在真实设备中,我的应用程序crash。
我认为这个问题是由memory leak 引起的,因为这没有出现在simulator 中,我在instrument 中测试我的应用程序,下面的screenshoot:
在仪器中:
情况:
-
我的主屏幕,单击主屏幕上的每个
item将进入不同的详细信息vc。 -
详一
vc,一详一vc,用户测试fetch data或随机点击: -
内存增长到
90.5MB,并没有下来,如果使用用户的测试方法,如果时间更长,会超过90.5MB:
我用instrument不是很好,内存是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
【问题讨论】:
-
@Rob 非常感谢 Rob,我想知道,每次来
detail vc,我请求网络使用AFNetworking,如果我弹回主vc,如果@987654345 @ 被detail vc杀死?或者如果没有,我现在就来detail vc并请求网络,如果在那里我创建2AFHTTPSessionManager? -
是的,如果你正在实例化你的
AFHTTPSessionManager内部细节 vc,但没有在任何地方保存对它的引用,是的,每次都会创建一个新的。最好将引用保存在某处(例如,在顶级视图控制器上实例化并传递它,或者让一些单例为您跟踪这一点,或者使用只实例化一次的静态变量)。
标签: ios memory memory-leaks instruments