Я испытываю странную проблему, связанную с шаблоном «передача по ссылке», в моем коде каждый раз, когда я вызываю метод, подобный:
[foo doSomethingWithError:&error];
оно замораживает мое приложение ... не исключение!
Если я заменю & error на nil , выполнение кода может продолжиться ... но почему? Работает ожидаемо в iOS 4 +
Я также пытался использовать __ autoreleasing для ошибки (как указано здесь в Apple: https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html),, но я не могу решить проблему: (
пс: я использую ARC
EDIT:
это пример метода, который вызывает зависание:
- (BOOL)loadData {
NSError *error = nil;
if ([self.fetchController performFetch:&error]) {
[self.tableView reloadData];
GTMLoggerDebug(@"Data loaded!");
return YES;
} else {
GTMLoggerDebug(@"Error while fetching data: %@", [error description]);
return NO;
}
}
метод вызывается в viewDidLoad , но он не работает ни в viewDidAppear .
fetchController объявлен как:
@property (readonly, strong) NSFetchedResultsController *fetchController;
Какой-то тест, который я использовал в loadData (все пройдено):
NSAssert(self.fetchController != nil, @"NO FETCH CONTROLLER");
NSAssert([self.fetchController respondsToSelector:@selector(performFetch:)], @"CAN'T FETCH?!");
NSAssert(self.fetchController.managedObjectContext != nil, @"invalid context");
NSAssert(self.fetchController.fetchRequest != nil, @"invalid fetchRequest");
NSAssert(self.fetchController.delegate != nil, @"invalid delegate");
NSAssert([NSThread isMainThread], @"NOT MAIN THREAD!");
затем в viewDidLoad :
[self performSelectorOnMainThread:@selector(loadData) withObject:nil waitUntilDone:YES/NO];
... но ничего ... это не работает ... или лучше, это работает очень и очень редко: (
РЕШИТЬ!
После нескольких часов испытаний и рассуждений я понял, что настоящая проблема связана с основными данными. Я использовал NSManagedObjectContext, совместно используемый потоками, и поскольку контекст НЕ является потокобезопасным, у меня возникли эти странные проблемы!