Поиск причины утечки памяти в Инструментах

Я запустил утечку в Инструментах, и она показывает мне утечку памяти со значением 100%. Я могу видеть строку кода, которая вызывает проблему. Но не совсем уверен, что это за ошибка..

- (void) listAllBooks {
    if (marrListFromDB != nil) {
        [marrListFromDB removeAllObjects];
        marrListFromDB = nil;
    }

    marrListFromDB = [[NSMutableArray alloc] init];
    ServerCommunicationAPI *servApi = [[ServerCommunicationAPI alloc] init];
    servApi.delegate = self;
    NSURL *url = [NSURL URLWithString:kLISTCONTENTS];
    [servApi listBooksWithDeviceID:singleton.g_strdevID deviceKey:singleton.g_strdevID andSessionString:singleton.g_strSessionID sessionKey:@"sessionKey" URL:url andRequestMethod:@"POST"];
}

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


person lakesh    schedule 06.02.2013    source источник


Ответы (3)


По предоставленной информации трудно сказать, но, может быть, свойство делегата ServerCommunicationAPI объявлено как (strong)? В этом случае servApi никогда не может быть освобожден, потому что он сохраняет сильную ссылку на себя (цикл сохранения).
Я предлагаю вам проверить в инструментах, какой тип объекта утекает, это значительно облегчит ответ.

person Reinhard Männer    schedule 06.02.2013
comment
как вы делаете последнее утверждение? - person lakesh; 06.02.2013
comment
В нижней правой части окна инструментов проверьте вкладку «Утечки», и она показывает утечки по обратной трассе. Крайний левый столбец показывает просочившиеся объекты. - person Reinhard Männer; 06.02.2013

Попробуйте это. Пусть это решит вашу проблему с утечкой памяти.

- (void) listAllBooks {
if (marrListFromDB != nil) {
    [marrListFromDB removeAllObjects];
    marrListFromDB = nil;
}
ServerCommunicationAPI *servApi ;
marrListFromDB = [[NSMutableArray alloc] init];
if(servApi == nil){

     ServerCommunicationAPI *servApi = [[ServerCommunicationAPI alloc] init];
}//Every time it going to alloc. It's strong object may be due do this memory leak happens. 
servApi.delegate = self;
NSURL *url = [NSURL URLWithString:kLISTCONTENTS];
[servApi listBooksWithDeviceID:singleton.g_strdevID deviceKey:singleton.g_strdevID andSessionString:singleton.g_strSessionID sessionKey:@"sessionKey" URL:url andRequestMethod:@"POST"];

}

person python    schedule 06.02.2013

Еще одна идея: может быть, вы выполняете свой код в отдельном потоке, для которого не настроен пул авторелиза? В этом случае сообщение, отправленное servApi, может создать объекты автоматического выпуска, которые не могут быть выпущены позже, поскольку пул автоматического выпуска не существует.
Итак, если ваш код не выполняется в основном потоке, проверьте, был ли настроен пул автоматического выпуска с помощью блок @autoreleasepool {...} для вашего потока.

person Reinhard Männer    schedule 06.02.2013