【问题标题】:Need Help With Memory Leaks在内存泄漏方面需要帮助
【发布时间】:2011-06-02 06:05:27
【问题描述】:

我刚刚为我的应用运行了 Intrument 的 Memory Leaks Tool,但出现以下错误:

这是它所指的方法:

特别是在这一行:NSSet *filteredExercisesFromSession = [session.exercises filteredSetUsingPredicate:[NSPredicate predicateWithFormat: @"name == %@", selectedExerciseName]]

- (void)createSession
{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
    NSDateComponents *dateComponentsForToday = [calendar components:unitFlags fromDate:self.picker.date];
    [dateComponentsForToday setHour:0];
    [dateComponentsForToday setMinute:0];
    [dateComponentsForToday setSecond:0];
    NSDate *targetDateBegins = [calendar dateFromComponents:dateComponentsForToday]; 
    NSDate *targetDateEnds = [targetDateBegins dateByAddingTimeInterval:(60 * 60 * 24 - 1)];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat: @"(timeStamp >= %@ && timeStamp <= %@)", targetDateBegins, targetDateEnds]];
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Session" inManagedObjectContext:managedObjectContext]];

    NSError *error = nil;
    NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    NSLog(@"Fetch error: %@", error);

    if ([results count])
    {
        session = (Session *)[results objectAtIndex:0];
        NSLog(@"Already have session for date: %@", session.timeStamp);
    }
    else
    {
        session = (Session *)[NSEntityDescription insertNewObjectForEntityForName:@"Session" inManagedObjectContext:managedObjectContext];
        session.timeStamp = self.picker.date;
        NSLog(@"New session for date: %@", session.timeStamp);
    }

    NSSet *filteredExercisesFromSession = [session.exercises filteredSetUsingPredicate:[NSPredicate predicateWithFormat: @"name == %@", selectedExerciseName]];
    if ([filteredExercisesFromSession count] > 0)
    {
        self.exercise = [filteredExercisesFromSession anyObject];
    }
    else
    {
        NSLog(@"exercise does not already exist");
        self.exercise = (Exercise *)[NSEntityDescription insertNewObjectForEntityForName:@"Exercise" inManagedObjectContext:managedObjectContext];
        self.exercise.name = selectedExerciseName;
        [session addExercisesObject:exercise];
        NSLog(@"exercise name: %@", exercise.name);
        NSLog(@"exercises in session:  %@",session.exercises);
    }

    if (![managedObjectContext save:&error]) 
    {
        // Handle the error.
    }
    NSLog(@"Save error: %@", error);

    [fetchRequest release];
    self.fetchedResultsController = nil;
    [setsTableView reloadData];
}

【问题讨论】:

  • NSSet *filteredExercisesFromSession。你释放这个对象了吗?
  • @singhSan filteredExercisesFromSession 已经在自动发布。
  • 我实际上已经稍微重组了这段代码,所以你现在可以忽略这个问题。我的新代码(虽然还没有工作)可以在这里看到:stackoverflow.com/questions/6195311/…
  • 让我告诉你,泄漏的原因并不总是仪器告诉你的。可能是使用 createSession 方法创建对象的对象泄漏,或者您正在显式释放自动释放的对象。在运行 Instruments 之前运行静态分析器以查找泄漏。这样做有时可以为您省去很多麻烦。

标签: iphone objective-c core-data memory-leaks


【解决方案1】:

您的代码有 self.exercise = 拥有所有权,因此请确保在 dealloc 中您释放了支持锻炼属性的成员变量。

【讨论】:

  • 我应该删除 self.exercise 并用 just exercise 替换它吗?
  • 不,这不能解决问题。 self.exercise (如果它是一个保留属性)获取自动释放对象的所有权。这就是你想要的。如果您将 self.exercise 替换为练习,则需要保留自动释放的对象。在这两种情况下,由于您拥有所有权,因此您需要在某个时候放弃所有权。而且由于它是一个属性,通常您在 dealloc 中执行此操作。
猜你喜欢
  • 2020-10-11
  • 1970-01-01
  • 2011-03-27
  • 2012-07-15
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
相关资源
最近更新 更多