Я запустил приложение с помощью инструментов, чтобы проверить, нет ли утечек памяти. Я заметил, что появились две утечки. Одна утечка происходит только при запуске, который заключается в следующем:IApp утечка памяти
Line 4 обижая бит кода здесь:
static id (*_old_UIStoryboard_instantiateViewControllerWithIdentifier_)(UIStoryboard *self, SEL _cmd, NSString *identifier);
static id _UIStoryboard_instantiateViewControllerWithIdentifier_(UIStoryboard *self, SEL _cmd, NSString *identifier)
{
id ret = _old_UIStoryboard_instantiateViewControllerWithIdentifier_(self, _cmd, identifier);
if ([[self delegate] respondsToSelector:@selector(storyboard:didInstantiateViewController:withIdentifier:)])
[[self delegate] storyboard:self didInstantiateViewController:ret withIdentifier:identifier];
return ret;
}
Самая большая утечка у меня есть на самом деле в AFNetworking
сек коде. Я не уверен, что его что-то, что я делаю, вызывает его. В файле класса: AFURLSessionManager.m
- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration {
self = [super init];
if (!self) {
return nil;
}
if (!configuration) {
configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
}
self.sessionConfiguration = configuration;
self.operationQueue = [[NSOperationQueue alloc] init];
self.operationQueue.maxConcurrentOperationCount = 1;
self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];
self.responseSerializer = [AFJSONResponseSerializer serializer];
self.securityPolicy = [AFSecurityPolicy defaultPolicy];
self.reachabilityManager = [AFNetworkReachabilityManager sharedManager];
self.mutableTaskDelegatesKeyedByTaskIdentifier = [[NSMutableDictionary alloc] init];
self.lock = [[NSLock alloc] init];
self.lock.name = AFURLSessionManagerLockName;
[self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
for (NSURLSessionDataTask *task in dataTasks) {
[self addDelegateForDataTask:task completionHandler:nil];
}
for (NSURLSessionUploadTask *uploadTask in uploadTasks) {
[self addDelegateForUploadTask:uploadTask progress:nil completionHandler:nil];
}
for (NSURLSessionDownloadTask *downloadTask in downloadTasks) {
[self addDelegateForDownloadTask:downloadTask progress:nil destination:nil completionHandler:nil];
}
}];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskDidResume:) name:AFNSURLSessionTaskDidResumeNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskDidSuspend:) name:AFNSURLSessionTaskDidSuspendNotification object:nil];
return self;
}
Эти строки из указанного выше способа показать, как утечка памяти - каждый раз, когда этот метод называется:
if (!configuration) {
configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
}
self.operationQueue = [[NSOperationQueue alloc] init];
Чем хуже один показ наиболее утечек:
self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];
И это:
self.mutableTaskDelegatesKeyedByTaskIdentifier = [[NSMutableDictionary alloc] init];
Тогда последний:
self.securityPolicy = [AFSecurityPolicy defaultPolicy];
Как я могу решить эти утечки? Кроме того, я хотел бы знать, почему они представляют собой утечку памяти, а не только решение, хотели бы узнать больше об этих случаях.
Спасибо Я сделаю это изменение и посмотреть, как это влияет на утечку. – Tander