(id *)ioValue
означает, что ioValue
является указателем на идентификатор, а не на сам идентификатор. Выражение *ioValue
относится к идентификатору, на который указывает ioValue
.
(NSError **)outError
означает, что outError
является указателем на NSError *
(который, в свою очередь, является указателем на NSError
).
Обычная причина для передачи указателей на функции таким способом - позволить функции возвращать что-то вызывающей стороне.
В приведенном выше случае функция может присвоить новый id
переменной, в которую передал вызывающий объект: *ioValue = something()
. Однако, поскольку вышеприведенная функция фактически не делает этого, она кажется избыточной; он мог быть записан как (id)ioValue
, а затем именоваться ioValue
вместо *ioValue
.
Однако, чехол outError
имеет смысл. В случае ошибки функция создает объект ошибки (NSError *error = ...
) и присваивает его переданной переменной таким образом: *outError = error
. Это приводит к изменению исходной переменной, которую передал вызывающий объект, чтобы при возврате функции вызывающий мог проверить переменную и увидеть возникшую ошибку:
id ioValue = something();
IOError *err;
if ([foo validateRadius:&ioValue error:&err]) {
NSLog("Yippee!");
} else {
reportError(err);
}