Инструменты, отмечающие утечки из автоматически выпущенных объектов - PullRequest
0 голосов
/ 21 октября 2011

Я запускаю Leaks в проекте, и он обнаруживает утечку памяти NSMutableDictionary, связанную со следующим кодом, который он помечает как Ответственный фрейм:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    Gallery *gallery = [self.galleries.galleries objectAtIndex:indexPath.row];
    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:gallery.name forKey:@"name"];
    NSNotification *notification = [NSNotification notificationWithName:REQUEST_VIEW_GALLERY 
                                                                 object:self
                                                               userInfo:userInfo];
    [self post:notification];
}

Во-первых, NSDictionary не выделен, нополученный автоматически выпущен через NSDictionary :: dictionaryWithObject: forKeys:, а во-вторых, это неизменный словарь, так как здесь может быть утечка?

enter image description here

enter image description here

Вот источник для основного объекта данных галереи:

#import "Gallery.h"
#import "Galleries.h"
#import "Image.h"

@implementation Gallery

@dynamic name;
@dynamic galleries;
@dynamic images;

//------------------------------------------------------------------------------
//  Initialisation
//------------------------------------------------------------------------------ 

+(Gallery *)initWithName:(NSString *)name photos:(NSArray *)photos managedObjectContext:(NSManagedObjectContext *)managedObjectContext
{
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    request.entity = [NSEntityDescription entityForName:@"Gallery" inManagedObjectContext:managedObjectContext];
    request.predicate = [NSPredicate predicateWithFormat:@"name = %@", name];

    NSError *error = nil;
    Gallery *gallery = [[managedObjectContext executeFetchRequest:request error:&error] lastObject];

    if(!gallery && !error)
    {
        gallery = [NSEntityDescription insertNewObjectForEntityForName:@"Gallery"
                                              inManagedObjectContext:managedObjectContext];
        gallery.name = name;
    }

    for (NSDictionary *photo in photos)
    {
        Image *image = [Image initWithFlickrData:photo managedObjectContext:managedObjectContext];
        [gallery addImagesObject:image];
    }
    return gallery;
}


//------------------------------------------------------------------------------
//  Public
//------------------------------------------------------------------------------ 

- (void)addImages:(NSOrderedSet *)values
{
    self.images = values;
}

- (void)addImagesObject:(Image *)value
{
    NSMutableOrderedSet *mutableImages = [NSMutableOrderedSet orderedSetWithOrderedSet:self.images];
    [mutableImages addObject:value];
    self.images = [NSOrderedSet orderedSetWithOrderedSet:mutableImages];
}

- (void)removeImagesObject:(Image *)value
{
    NSMutableOrderedSet *mutableImages = [NSMutableOrderedSet orderedSetWithOrderedSet:self.images];


[mutableImages removeObject:value];
self.images = [NSOrderedSet orderedSetWithOrderedSet:mutableImages];
[self.managedObjectContext deleteObject:value];
}

@end
...