Нужна помощь в устранении утечки памяти после ее обнаружения с помощью инструментов

У меня есть приложение в Xcode 4.6, которое соединяется с Facebook. Я заметил, что время от времени, когда приложение переходит в фоновый режим и возвращается на передний план, время от времени возникают сбои в разных точках приложения. Из-за непоследовательности сбои было трудно анализировать, поэтому я попытался использовать инструменты для выявления утечек памяти. Я новичок в iOS, и хотя мне удалось успешно определить, что у меня есть утечки памяти, и я даже вижу, какие методы их вызывают, я ловлю себя на мысли, что теперь? Другими словами, я вижу, в чем проблема, но не могу ее идентифицировать. Я надеюсь, что если я выделю пример, кто-то может пролить свет.

**Вот что я смотрю в инструментах:

снимок экрана инструментов

Просто взгляните на первый просочившийся объект в списке:

Утечка объекта = сессия FB

Ответственный фрейм =

+[FBSession openActiveSessionWithPermissions:allowLoginUI:allowSystemAccount:isRead:defaultAudience:completionHandler:]

Я интерпретирую это как означающее, что внутри этого метода существует какой-то утечка объекта. Это правильно? Реализованный метод существует в моем делегате приложения и выглядит так:

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
  NSArray *permissions = [[NSArray alloc] initWithObjects:
                        @"user_about_me",
                        @"read_friendlists",
                        nil];
  //IMPLEMENTED METHOD
  return [FBSession openActiveSessionWithReadPermissions:permissions
                                          allowLoginUI:allowLoginUI
                                     completionHandler:^(FBSession *session,
                                                         FBSessionState state,
                                                         NSError *error) {
                                         [self sessionStateChanged:session
                                                             state:state
                                                             error:error];
                                     }];
}

На данный момент я не уверен, что мне нужно делать, или что в этом методе может даже вызвать утечку. Я просмотрел учебники по утечке памяти, но они только помогли мне найти проблему, но не помогли мне понять, как ее решить. Любая помощь приветствуется.


person jac300    schedule 26.02.2013    source источник
comment
Используете ли вы автоматический подсчет ссылок в приложении?   -  person Liron    schedule 26.02.2013


Ответы (1)


Как правило, вы не должны передавать self в блок, так как блок сохраняет его. Кажется, что FBSession также сохраняет completionHandler, поэтому он становится циклом сохранения.

Для того, чтобы сломать его, используйте одну из следующих конструкций:

__weak FBSession *zelf = self; // OK for iOS 5 only
__unsafe_unretained FBSession *zelf = self; // OK for iOS 4.x and up
__block FBSession *zelf = self; // OK if you aren't using ARC

а потом

return [FBSession openActiveSessionWithReadPermissions:permissions
                                      allowLoginUI:allowLoginUI
                                 completionHandler:^(FBSession *session,
                                                     FBSessionState state,
                                                     NSError *error) {
                                     [**zelf** sessionStateChanged:session
                                                         state:state
                                                         error:error];
                                 }];

См. это сообщение для более полное объяснение того, что такое циклы сохранения.

person kovpas    schedule 26.02.2013