2015-03-20 2 views
0

Я запустил приложение с помощью инструментов, чтобы проверить, нет ли утечек памяти. Я заметил, что появились две утечки. Одна утечка происходит только при запуске, который заключается в следующем: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]; 

Как я могу решить эти утечки? Кроме того, я хотел бы знать, почему они представляют собой утечку памяти, а не только решение, хотели бы узнать больше об этих случаях.

ответ

0

пытаются использовать в блоках weak_self, а не себя, например:

__weak ClassName *weak_self = self; 
    [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { 
     for (NSURLSessionDataTask *task in dataTasks) { 
      [weak_self addDelegateForDataTask:task completionHandler:nil]; 
     } 

     for (NSURLSessionUploadTask *uploadTask in uploadTasks) { 
      [weak_self addDelegateForUploadTask:uploadTask progress:nil completionHandler:nil]; 
     } 

     for (NSURLSessionDownloadTask *downloadTask in downloadTasks) { 
      [weak_self addDelegateForDownloadTask:downloadTask progress:nil destination:nil completionHandler:nil]; 
     } 
    }]; 
+0

Спасибо Я сделаю это изменение и посмотреть, как это влияет на утечку. – Tander

Смежные вопросы