Cocoa memory management - object going nil on me

Posted by SirRatty on Stack Overflow See other posts from Stack Overflow or by SirRatty
Published on 2010-06-16T07:37:27Z Indexed on 2010/06/16 7:42 UTC
Read the original article Hit count: 179

Filed under:
|

Hi all,

Mac OS X 10.6, Cocoa project, with retain/release gc

I've got a function which:

  • iterates over a specific directory, scans it for subfolders (included nested ones), builds an NSMutableArray of strings (one string per found subfolder path), and returns that array.

e.g. (error handling removed for brevity).

NSMutableArray * ListAllSubFoldersForFolderPath(NSString *folderPath)
{
    NSMutableArray *a = [NSMutableArray arrayWithCapacity:100];
    NSString *itemName = nil;
    NSFileManager *fm = [NSFileManager defaultManager];
    NSDirectoryEnumerator *e = [fm enumeratorAtPath:folderPath];

    while (itemName = [e nextObject]) {
        NSString *fullPath = [folderPath stringByAppendingPathComponent:itemName];
        BOOL isDirectory;
        if ([fm fileExistsAtPath:fullPath isDirectory:&isDirectory]) {
            if (isDirectory is_eq YES) {
                [a addObject: fullPath];
            }
        }           
    }
    return a;
}

The calling function takes the array just once per session, keeps it around for later processing:

static NSMutableArray *gFolderPaths = nil;

...

gFolderPaths = ListAllSubFoldersForFolderPath(myPath);
[gFolderPaths retain];

All appears good at this stage. [gFolderPaths count] returns the correct number of paths found, and [gFolderPaths description] prints out all the correct path names.

The problem:

When I go to use gFolderPaths later (say, the next run through my event loop) my assertion code (and gdb in Xcode) tells me that it is nil.

I am not modifying gFolderPaths in any way after that initial grab, so I am presuming that my memory management is screwed and that gFolderPaths is being released by the runtime.

My assumptions/presumptions

I do not have to retain each string as I add it to the mutable array because that is done automatically, but I do have to retain the the array once it is handed over to me from the function, because I won't be using it immediately. Is this correct?

Any help is appreciated.

© Stack Overflow or respective owner

Related posts about cocoa

Related posts about memory-management