Решение для утечки в touchXML при отсутствии интернета и использовании initWithContentsOfURL - PullRequest
1 голос
/ 08 декабря 2011

В инструментах каждый раз отображается протекающий объект CXMLDocument, веб-сервис обращается к XML-запросу И, когда нет доступного подключения к Интернету.Вот мой код:

NSString *path = ... some URL
NSURL *url = [NSURL URLWithString: path];
CXMLDocument *itemListParser; = [[CXMLDocument alloc] initWithContentsOfURL:url options:0 error:nil];
... other stuff ...

Если мы будем копать глубже и отследим вызов initWithContentsOfURL, мы найдем этот метод в "CXMLDocument.m":

- (id)initWithContentsOfURL:(NSURL *)inURL encoding:(NSStringEncoding)encoding options:(NSUInteger)inOptions error:(NSError **)outError
  {
  if (outError)
    *outError = NULL;

  NSData *theData = [NSData dataWithContentsOfURL:inURL options:NSUncachedRead error:outError];
  if (theData)
    {
    self = [self initWithData:theData encoding:encoding options:inOptions error:outError];
    }
  else
    {
        [self release]; //My suggested fix: We need to release an alloc'ed object because after the "self = null" it will be unable to release it. See the info below.
        self = NULL;
    }

  return(self);
}

Появляется, если theData равен nil(например, без соединения), тогда self будет равно нулю, и поэтому результат вызова TouchXML initWithContentsOfURL также будет равен нулю.Итак, в моем коде:

CXMLDocument *itemListParser; = [[CXMLDocument alloc] initWithContentsOfURL:url options:0 error:nil];

Я выделяю память, но init возвращает nil, поэтому itemListParser также становится nil.Поэтому позже попытка освободить анализатор с помощью [itemListParser release] ничего не делает, потому что release отправляется на nil.

Мне удалось исправить утечку, добавив «[self release]» перед «self = NULL» (см. строку с моим комментарием в методе TouchXML initWithContentsOfURL)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...