Сохранение в контекст управляемого объекта iOS

У меня есть следующий код для сохранения объекта в контексте управляемого объекта.

    NSError *savingError = nil;

    if ([self.managedObjectContext save:&savingError]) {
        NSLog(@"Successfully saved the context.");
    } else {
        NSLog(@"Failed to save the context. Error = %@", savingError);
    }

Согласно моей документации, я понимаю следующее: После вставки новой сущности в контекст, мы должны сохранить контекст. Это сбросит все несохраненные данные контекста в постоянное хранилище. Мы можем сделать это, используя save: метод экземпляра контекста нашего управляемого объекта. Если BOOL возвращаемое значение этого метода YESМы можем быть уверены, что наш контекст сохранен.

Что мне не понятно, так это синтаксис после save:в частности, амперсанд '&' прямо перед местным savingError variable, Что это говорит компилятору?

3 ответа

Решение

Посмотрите: почему `&` (амперсанд) ставится перед некоторыми параметрами метода?

Вкратце: вам нужно передать указатель на указатель NSError, поэтому save: может назначить случайную ошибку savingError,

& Оператор в основном означает "адрес". Он принимает значение и возвращает указатель на это значение. Так что в этом случае &savingError это значение типа NSError** который является указателем, который содержит адрес вашего savingError переменная. Код вызова может затем использовать *error "разыменовать" этот указатель и вернуть вашу переменную. Это значит, что можно сказать

*error = [NSError errorWithDomain:...]

а затем в вашем коде savingError переменная теперь будет заполнена новой ошибкой.

Это довольно распространенный стиль программирования на C для имитации наличия нескольких возвращаемых значений. Подобные параметры (указатели на значения, где вы передаете адрес переменной и функция заполняет ее) обычно называются "исходящими параметрами" или "выходными параметрами".

& Представляет адрес объекта. Когда мы передаем объекты методу, ему передается копия объекта. Любые изменения, внесенные в этот объект внутри этого метода, не влияют на объект, который используется с вызовом метода.

Когда мы используем &, на самом деле мы передаем адрес объекта, так что любое изменение, которое мы вносим в объект в этом методе, повлияет на объект, который используется в качестве аргумента при вызове метода.

Здесь в save: метод, мы передаем объект класса NSError. Если какая-то ошибка возникает во время сохранения, метод (процесс) можно найти с помощью этого объекта NSError.

[savingError localizedDescription];
Другие вопросы по тегам