Issue 87: A leak when no internet connection and using initWithContentsOfURL
Status:  New
Owner: ----
Reported by gyte...@gmail.com, Dec 8, 2011
There's a leaking CXMLDocument object shown in instruments everytime, a request to an XML is made to  a webservice AND when there's no internet connection available. Here's my code:

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

If we digg deeper and trace initWithContentsOfURL call then we will find this method in "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);
    }

It appears, if theData is nil (for example no connection) then self will be nil, and so the result of the call to TouchXML initWithContentsOfURL will be nil too. So, in my code:

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

I'm alloc'ing a memory but init returns nil, and so itemListParser becomes nil too. So later, trying to release the parser with [itemListParser release] does nothing because release is send to nil.

I was able to fix a leak by adding "[self release]" before "self = NULL" (see the line with my comment in TouchXML initWithContentsOfURL method)

---- additional notes ---
Using latest ToucXML release, objective-c, Mac OS X Snow Leopard.