сам.произошел сбой в операторе if
Это связано с тем, что вы рекурсивно вызываете метод fetchedResultsController
в бесконечный цикл.
Теперь есть еще несколько проблем.
Во-первых, я бы предложил разделить этот метод на 2 части:
- инициализация контроллера извлеченных результатов
- выборка данных
Кроме того, вашfetchRequest
никогда не выпускается.И не aFetchedResultsController
.Вы владеете обоими этими объектами внутри этого метода, поэтому вы должны освободить их для предотвращения утечек.
Основываясь на этих замечаниях, код будет выглядеть следующим образом:
- (NSFetchedResultsController *)fetchedResultsController
{
// In this method, because it's overriding the accessor in the super-class,
// you must use |super.fetchedResultsController|,
// otherwise you will trigger an infinite loop!
if (super.fetchedResultsController != nil)
{
return super.fetchedResultsController;
}
id delegate = [[UIApplication sharedApplication] delegate];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// ...
// omitted the other details...
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[delegate managedObjectContext] sectionNameKeyPath:nil cacheName:@"Root2"];
aFetchedResultsController.delegate = self;
super.fetchedResultsController = aFetchedResultsController;
[aFetchedResultsController release];
[fetchRequest release];
return super.fetchedResultsController;
}
- (void)fetch
{
NSError *error = nil;
// using |self| here is OK, because you're referring to the current object's method
if (![self.fetchedResultsController performFetch:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
Что касается использования super
против self
:
super.foo
или [super foo]
начинает искать метод foo
в суперклассе self.foo
или [self foo]
для метода foo
в классе текущего объекта
В вашем случае это не будет иметь большого значения, за исключением того факта, что self.fetchedResultsController
вызовет бесконечный цикл, как я упоминал ранее, если он используетсявнутри аксессора.
Надеюсь, я понял это правильно и что это прояснило для вас ...