Chetan
Chetan

Reputation: 48011

Objective-C memory management strange results

I am calling a function repeatedly with a loop, and the loop runs inside of a thread. The thread has an autorelease pool.

I have the following code inside that function:

NSXMLDocument* undoXML;
NSData* undoData = [NSData dataWithContentsOfFile:undoFilePath];
undoXML = [[NSXMLDocument alloc] initWithData:undoData options:NSXMLDocumentTidyXML error:&err];

NSData* undoData2;
undoData2 = [undoXML XMLData];

[undoData2 release];
[undoXML release];

I'm getting the following strange results:

NSData* undoData3;
undoData3 = [undoXML XMLData];
[undoData3 release];

My program leaks even more memory than before.

I'm really confused and I badly need help figuring out what's going on. Maybe my autorelease pool isn't working correctly? Why is this happening?

Upvotes: 1

Views: 318

Answers (4)

Chris Johnsen
Chris Johnsen

Reputation: 224691

undoData should be preset to be autoreleased (according to naming convention dataWithContentsOfFile: returns an autoreleased object). But unless you have your own autorelease pool, nothing that is set to autorelease will actually be deallocated until the active pool is drained (i.e. sometime after your function returns).

Your thread may have its own autorelease pool, but unless you are creating one inside your own function, nothing will be deallocated until after your function exits.

If you want to trigger the draining of autoreleased objects in the middle of a function (say once per loop), you need to manage your own autorelease pool.

while(looping) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // do stuff that produces autoreleased objects

    [pool drain];
}

Also, per cobbal's comment on your question, it looks like you should not be releasing undoData2 (or undoData3). Based on the naming convention -[NSXMLDocument XMLData] should be returning an autoreleased object.

Upvotes: 0

bbum
bbum

Reputation: 162712

Are you sure it is leaking? Or is it simply growing in size?

What does your loop look like and how is the autorelease pool integrated into it?

The autorelease pool must be inside the loop or your loop will just build up tons of memory over time. That the leaks instrument doesn't show leaks indicates that you have violated the memory management rules or your loop is incorrect.

Upvotes: 2

Rizon
Rizon

Reputation: 129

If you have access to the source code of the NSData class you should look at what objects are being instantiated when undoData3 is created. I say this because you create the object and immediately destroy it. The issue must be that memory is being allocated inside the class but not being deallocated in it's destructor.

Upvotes: -2

pestilence669
pestilence669

Reputation: 5701

Try running Instruments on your project w/ the leak detection settings. This should identify exactly where your leak is occurring (even in the system libraries).

Run -> Run With Performance Tool -> Leaks

Upvotes: 1

Related Questions