Утечки при загрузке данных из plist в CoreData - PullRequest
0 голосов
/ 13 ноября 2010

у меня есть утечки в этом коде.Утечки перформанс-инструмента говорят мне, что это в этой строке:

NSArray *fakeData = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FakeData" ofType:@"plist"]];

Я не могу выяснить, что происходит.У plist, который я загружаю, есть 3 элемента NSDictionary, так же как утечки на скриншоте.Каждый словарь имеет 3 строки.

Весь код:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
//Ładowanie danych
if (![[FlickrFetcher sharedInstance] databaseExists]) {
    NSArray *fakeData = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FakeData" ofType:@"plist"]];

    for (NSDictionary *element in fakeData) {
        //Wypełnianie CoreData danymi
        Photo *newPhoto = (Photo *)[NSEntityDescription insertNewObjectForEntityForName:@"Photo"
                                                            inManagedObjectContext:[[FlickrFetcher sharedInstance] managedObjectContext]];
        NSLog(@"Creating Photo: %@", [element objectForKey:@"name"]);
        [newPhoto setName:[element objectForKey:@"name"]];
        [newPhoto setImageURL:[element objectForKey:@"path"]];

        NSLog(@"Person is: %@", [element objectForKey:@"user"]);ŕŕŕ
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", [element objectForKey:@"user"]];

        NSMutableArray *peopleArray = (NSMutableArray *)[[FlickrFetcher sharedInstance] fetchManagedObjectsForEntity:@"Person" 
                                                                                                   withPredicate:predicate];
        NSEnumerator *enumerator = [peopleArray objectEnumerator];
        Person *person;
        BOOL exists = FALSE;

        while (person = [enumerator nextObject]) {
            NSLog(@"Person is: %@", person.name);
            if ([person.name isEqualToString:[element objectForKey:@"user"]]) {
                exists = TRUE;
                NSLog(@"-- Person exists: %@", person.name);
                [newPhoto setOwner:person];
            }
        }

        if (!exists) {
            Person *newPerson = (Person *)[NSEntityDescription insertNewObjectForEntityForName:@"Person" 
                                                                    inManagedObjectContext:[[FlickrFetcher sharedInstance] managedObjectContext]];
            [newPerson setName:[element objectForKey:@"user"]];
            NSLog(@"Person created: %@", newPerson.name);
            [newPhoto setOwner:newPerson];
        }

        NSError *error;
        if (![[[FlickrFetcher sharedInstance] managedObjectContext] save:&error]) {
            NSLog(@"Unresolved error %@ %@", error, [error userInfo]);
            exit(-1);
        }

        [fakeData release];     
    }

}

//Person Navigation Controller
personNavigationController = [[UINavigationController alloc] init];
PersonListViewController *personListViewController = [[PersonListViewController alloc] initWithStyle:UITableViewStylePlain];
personListViewController.title = @"Contacts";
[personNavigationController pushViewController:personListViewController animated:NO];
[personListViewController release];

//Recent Photo Navigation Controller
recentPhotoNavigationController = [[UINavigationController alloc] init];
RecentPhotoViewController *recentPhotoViewController = [[RecentPhotoViewController alloc] init];
recentPhotoViewController.title = @"Recent";
UITabBarItem *item = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemRecents tag:1];
recentPhotoViewController.tabBarItem = item;
[item release];
[recentPhotoNavigationController pushViewController:recentPhotoViewController animated:NO];
[recentPhotoViewController release];

//Tab Bar Controller
tabBarController = [[UITabBarController alloc] init];
tabBarController.viewControllers = [NSArray arrayWithObjects:
                                    personNavigationController,
                                    recentPhotoNavigationController,
                                    nil];


[window addSubview:tabBarController.view];
[window makeKeyAndVisible];

return YES;

}

1 Ответ

0 голосов
/ 14 ноября 2010

Похоже, ваш массив fakeData освобождается внутри цикла for, что кажется проблематичным на нескольких уровнях.Вы, вероятно, хотели выпустить его после завершения цикла.С точки зрения утечек, цикл for никогда не может быть введен, и в этом случае объект будет пропущен.

...