iOS 5: невозможно использовать шаблон «передача по ссылке» с помощью NSError - PullRequest
2 голосов
/ 16 октября 2011

Я испытываю странную проблему, связанную с шаблоном «передача по ссылке», в моем коде каждый раз, когда я вызываю метод, подобный:

[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, совместно используемый потоками, и поскольку контекст НЕ является потокобезопасным, у меня возникли эти странные проблемы!

...