Сохранение в контекст управляемого объекта 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];