Какой смысл (NSError **) ошибка?

Пример: -save: метод NSManagedObjectContext объявляется как это:

- (BOOL)save:(NSError **)error

Так как NSError уже является классом, и передача указателя на самом деле имела бы эффект изменения этого объекта в реализации -save:, какой смысл того, чтобы передать указатель на указатель сюда? Каково преимущество/смысл?

Пример использования:

NSError *error;
if (![managedObjectContext save:&error]) {
    // Handle the error.
}
8
задан John Topley 9 March 2011 в 17:16
поделиться

5 ответов

Вы не можете «удалить» CDATA, но вы можете несколько грубо добиться желаемого вывода:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
   <Detail>
        <xsl:variable name="before" select="substring-before(//Detail,'&lt;div class=&quot;heading&quot;&gt;')" />
        <xsl:variable name="afteropen" select="substring-after(//Detail,'&lt;div class=&quot;heading&quot;&gt;')" />
        <xsl:variable name="body" select="substring-before($afteropen, '&lt;/div&gt;')" />
        <xsl:variable name="after" select="substring-after($afteropen, '&lt;/div&gt;')" />
        <xsl:value-of select="concat($before, '&lt;h1&gt;', $body, '&lt;/h1&gt;',$after)"
                disable-output-escaping="yes"       />
   </Detail>
</xsl:template>
</xsl:stylesheet>

Это будет работать для первого типа div, вы пытаетесь проанализировать, и вы можете следить за чем-то похожем со вторым один. Это может быть сделано более общем с некоторыми усилиями.

-121--3632203-

Если вы просто пройдете у указателя, весь метод может изменить, что вы указываете на уже существующий объект NSError.

путем прохождения указателя на указатель, он может создавать новые объекты NSError и оставьте вас с указателем, который указывает на них.

16
ответ дан 5 December 2019 в 04:42
поделиться

@anon правильный. Я добавлю: Это какао-способ создавать ошибки, на месте бросков исключений.

В вашем примере у вас есть:

NSError *error = nil;
if (![managedObjectContext save:&error]) {
    // Handle the error.
}

сразу после звонка в Сохранить: , если произошла ошибка, то Сохранить: метод создаст новый NSError Объект и изменил вашу ошибку переменную, чтобы указать из NIL на новый объект ошибки. Таким образом, вы можете изучить NSError , объект самостоятельно и отвечаю на него соответствующим образом.

ИМО, это более чистое, чем бросать исключение (которое в моей философии должна быть сделана только тогда, когда происходит что-то катастрофическое и неисправимое).

6
ответ дан 5 December 2019 в 04:42
поделиться

Это позволяет способу выделить новый NSError и изменить указатель на то, чтобы указать на него, скорее Чем необходимость модифицировать NSError уже указал - к (что если это недостаточно велико?)

3
ответ дан 5 December 2019 в 04:42
поделиться

Если вы только что передали указатель, все, что мог бы сделать метод, изменит уже существующий объект NSError, на который вы указываете.

Передавая указатель на указатель, он может создавать новые объекты NSError и оставлять указатель, указывающий на них.

-121--3432279-

В модуле _ mysql используйте следующий вызов:

conn.use_result()

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

Альтернатива (и значение по умолчанию):

conn.store_result()

Это указывает на подключение для получения всего результирующего набора после выполнения запроса, и последующие выборки будут просто повторяться через результирующий набор, который теперь находится в памяти приложения Python. Если результирующий набор очень велик, следует рассмотреть возможность использования LIMIT , чтобы ограничить его до того, что можно обработать.

Обратите внимание, что MySQL не разрешает выполнение другого запроса до тех пор, пока не будут получены все строки из оставшейся открытой.

В модуле MySQLdb эквивалентным является использование одного из этих двух различных объектов курсора из MySQLdb.cusrors :

  • CursorUseResultMixIn
  • CursorStaseResultMixIn
-121--5044801-

Преимущество в том, что вы не хотите Как указано в документации:

" Указатель на объект NSError. Создавать объект NSError не требуется. "

3
ответ дан 5 December 2019 в 04:42
поделиться

Это то, что некоторые люди называют параметром «OUT».

Вы не передаете указатель на объект NSError, вы передаете указатель на локальную переменную . Это дает под названием метод возможность модифицировать локальную переменную; В этом случае, чтобы назначить его в экземпляр NSError.

Возможно, то, что сбивает с толку, это то, что локальная переменная вы передаваешься в Сохранить: сам по себе является указателем, поэтому тип переменного заканчивается как указатель на указатель.

Нижняя линия, это указатель на локальную переменную, и она работает так же, является ли локальная переменная int или NSError * .

13
ответ дан 5 December 2019 в 04:42
поделиться