Я играл с основными данными и начал писать несколько методов для запроса различных диапазонов дат данных.Моя базовая модель данных очень проста (сущность с именем Smoke с одним полем - отметка времени (типа date).
Когда я выполняю свой код, возвращается правильное количество, но я получаю ошибку автоматического выпуска - я использовал NSZombiesчтобы отследить его до метода ниже:
- (NSUInteger)retrieveSmokesForUnit:(NSCalendarUnit)unit
{
NSDate *beginDate = [[NSDate alloc] init];
NSDate *endDate = [[NSDate alloc] init];
[self rangeForUnit:unit containingDate:[NSDate date] startsAt:&beginDate andEndsAt:&endDate];
NSInteger count = [self numberOfSmokes:beginDate toDate:endDate];
[beginDate release];
[endDate release];
return count;
}
Итак, я понял - я выпускаю объекты NSDate beginDate и endDate слишком много раз - но почему это происходит? Я думал, что это правило, когда вы создаете экземплярс помощью alloc вы используете release? Я не выпускаю их явно где-то еще в коде, поэтому должно быть что-то происходящее за кулисами. Если бы кто-то мог указать мне правильное направление, это было бы здорово!
Вот другие вовлеченные методы, так как проблема должна быть где-то в них. Я предполагаю, что это связано с тем, как я передаю указатели на даты вокруг?
Первоначальный вызов, вызываемый в представленииКонтроллер
- (IBAction)cigButtonPressed
{
NSUInteger smokes = [[DataManager sharedDataManager] retrieveSmokesForUnit:NSWeekCalendarUnit];
NSLog(@"Count test = %i", smokes);
}
Этот метод называется началом вопроса, который, в свою очередь, вызывает:
- (NSUInteger)numberOfSmokes:(NSDate *)beginDate toDate:(NSDate *)endDate {
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Smoke" inManagedObjectContext:self.managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
//Create predicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(timeStamp >= %@) AND (timeStamp < %@)", beginDate, endDate];
//Setup request
[request setEntity:entity];
[request setPredicate:predicate];
NSError *error;
NSUInteger smokes = [self.managedObjectContext countForFetchRequest:request error:&error];
NSLog(@"Number of smokes retrieved: %d", smokes);
[request release];
return smokes;
}
Спасибо.s!
Редактировать - исключить связанный метод:
- (void)rangeForUnit:(NSCalendarUnit)unit containingDate:(NSDate *)currentDate startsAt:(NSDate **)startDate andEndsAt:(NSDate **)endDate {
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[calendar rangeOfUnit:unit startDate:&*startDate interval:0 forDate:currentDate];
*endDate = [calendar dateByAddingComponents:[self offsetComponentOfUnit:unit] toDate:*startDate options:0];
[calendar release];
}