iPhone: Memory leak when using NSOperationQueue...

Posted by MacTouch on Stack Overflow See other posts from Stack Overflow or by MacTouch
Published on 2010-04-18T01:28:34Z Indexed on 2010/04/18 1:33 UTC
Read the original article Hit count: 610

Filed under:
|
|

Hi,

I'm sitting here for at least half an hour to find a memory leak in my code. I just replaced an synchronous call to a (touch) method with an asynchronous one using NSOperationQueue. The Leak Inspector reports a memory leak after I did the change to the code. What's wrong with the version using NSOperationQueue?

Version without a MemoryLeak

-(NSData *)dataForKey:(NSString*)ressourceId_
{
   NSString *path = [self cachePathForKey:ressourceId_]; // returns an autoreleased NSString*
   NSString *cacheKey = [self cacheKeyForRessource:ressourceId_]; // returns an autoreleased NSString*

   NSData *data = [[self memoryCache] valueForKey:cacheKey];
   if (!data)
   {
      data = [self loadData:path]; // returns an autoreleased NSData* 
      if (data)
      {
         [[self memoryCache] setObject:data forKey:cacheKey];
      }
   }
   [[self touch:path];
   return data;
}

Version with a MemoryLeak (I do not see any)

-(NSData *)dataForKey:(NSString*)ressourceId_
{
   NSString *path = [self cachePathForKey:ressourceId_]; // returns an autoreleased NSString*
   NSString *cacheKey = [self cacheKeyForRessource:ressourceId_]; // returns an autoreleased NSString*

   NSData *data = [[self memoryCache] valueForKey:cacheKey];
   if (!data)
   {
      data = [self loadData:path]; // returns an autoreleased NSData* 
      if (data)
      {
         [[self memoryCache] setObject:data forKey:cacheKey];
      }
   }
   NSInvocationOperation *touchOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(touch:) object:path];
   [[self operationQueue] addOperation:touchOp];
   [touchOp release];
   return data;
}

And of course, the touch method does nothing special too. Just change the date of the file.

-(void)touch:(id)path_
{
   NSString *path = (NSString *)path_
   NSFileManager *fm = [NSFileManager defaultManager];
   if ([fm fileExistsAtPath:path])
   {
      NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[NSDate date], NSFileModificationDate, nil];
      [fm setAttributes: attributes ofItemAtPath:path error:nil];
   }
}

© Stack Overflow or respective owner

Related posts about iphone

Related posts about memory-leaks