将数据从plist加载到CoreData时出现泄漏

时间:2010-11-13 10:57:06

标签: iphone plist memory-leaks

我在此代码中有泄漏。性能泄漏的工具告诉我这就是这一行:

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 :(得分:0)

看起来你的fakeData数组正在for循环内部发布,这在几个层面上似乎有问题。你可能打算在循环退出时释放它。从泄漏的角度来看,可能永远不会输入for循环,在这种情况下,对象将被泄露。