On 1 Jun 2010, at 02:41, Ken Tozier wrote:

> Hi
> 
> I'm trying to write a thumbnailer class that takes a path to a photo and 
> creates a thumbnail at a user specified size. The code creates the thumbnails 
> OK, but there's this monster memory leak, to the tune of about 100 MB every 
> 3-4 seconds, that seems to be related to NSImage.
Have you tried using Instruments? It was built for this sort of thing.
Are you sure that it is a leak and not just the memory usage pattern.
You can trigger a collection with [[NSGarbageCollector defaultCollector] 
collectExhaustively];
> 
> What's happening is that if I comment out the line that initializes a new 
> image, the memory leak disappears.
If don't allocate anything then you won't get ANY memory usage!

> I've tried forcibly releasing the images, tried autoreleasing them, tried 
> creating a fixed size buffer into which all the images are read, nothing 
> seems to work.
With GC release et al are no-ops so calling them does nothing.

> 
> I'm using garbage collection, so that along with the deliberate releasing of 
> the images, makes me wonder why the collector isn't getting the hint, that 
> it's ok to release the memory for these photos. Could someone point out what 
> I'm doing in the following code that prevents the images from getting 
> released?
> 
> Thanks for any help
> 
> - (NSString *) createJPEGThumbnail:(NSString *) inPath
>                       site:(NSString *) inSite
> {
>       NSDictionary                    *siteRecord,
>                                                       *pubRecord;
>                                                       
>       NSString                                *sourceName             = 
> [inPath lastPathComponent],
>                                                       *sourceRoot             
>         = [sourceName stringByDeletingPathExtension],
>                                                       *destName               
>         = [[sourceRoot stringByAddingPercentEscapesUsingEncoding: 
> NSUTF8StringEncoding] stringByAppendingPathExtension: @"jpg"],
>                                                       *pubCode                
>         = [self pubCodeFromPath: inPath],
>                                                       *thumbPath;
> 
>       NSFileManager                   *manager                        = 
> [NSFileManager defaultManager];
>                       
>       siteRecord                              = [thumbDirectories 
> objectForKey: inSite];
>       pubRecord                               = [[siteRecord objectForKey: 
> @"publications"] objectForKey: pubCode];
>       
>       if (pubRecord == nil)
>               pubRecord                       = [[siteRecord objectForKey: 
> @"publications"] objectForKey: @"~MISCELLANEOUS"];
>               
>       thumbPath                               = [[pubRecord objectForKey: 
> @"thumb_path"] stringByAppendingPathComponent: destName];
>       
>       if (![manager fileExistsAtPath: thumbPath])
>       {
>               // I've tried both of these, didn't make the slightest 
> difference.
>               // Both leaked memory at a furious pace
>               
>               // Option 1:
>               NSImage                                         *image          
>         = [[[NSImage alloc] initWithContentsOfFile: inPath] autorelease];
>               
>               /* do some stuff */

What happens to image here? 
If a reachable reference is created to image then the collector will not 
scavenge it.

>               
>               
>               // Option 2
>               NSImage                                         *image          
>         = [[NSImage alloc] initWithContentsOfFile: inPath];
>               
>               /* do some stuff */
>               
>               [image release];
>       }
>       
>       // make sure it worked
>       if ([manager fileExistsAtPath: thumbPath])
>               return thumbPath;
>       else
>               return nil;
> }
> _______________________________________________
> 
> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
> 
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
> 
> Help/Unsubscribe/Update your Subscription:
> http://lists.apple.com/mailman/options/cocoa-dev/jonathan%40mugginsoft.com
> 
> This email sent to jonat...@mugginsoft.com

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to