Что означает inout CGPoint * как параметр?

В методах делегата UIScrollView есть:

scrollViewWillEndDragging:withVelocity:targetContentOffset:

и последний параметр:

(inout CGPoint *)targetContentOffset

Мне любопытно, что означает inout и почему CGPoint является указателем. Я попытался вывести targetContentOffset на консоль, но не знаю, как это сделать. Любая помощь приветствуется!


person c0sic    schedule 17.09.2013    source источник
comment
Для печати используйте *targetContentOffset для получения объекта, на который он указывает, или targetContentOffset->x (-> вместо .) для доступа к элементам структуры через указатель; Я уверен, что кто-то даст должный содержательный ответ на вопрос, почему.   -  person Tommy    schedule 17.09.2013


Ответы (1)


Это означает, что параметр используется для отправки данных in, а также для получения данных out.

Давайте посмотрим на пример реализации:

- (void)increment:(inout NSUInteger*)number {
    *number = *number + 1;
}


NSUInteger someNumber = 10;
[self increment:&someNumber];
NSLog(@"Number: %u", someNumber); //prints 11

Этот шаблон часто используется со структурами C, например CGPoint, потому что они передаются по значению (копируются).

Также обратите внимание, что inout здесь не является обязательным, но помогает компилятору понять смысл вашего кода и лучше выполнять оптимизацию.

Существуют также отдельные аннотации in и out, но, насколько я знаю, нет никаких предупреждений компилятора, когда вы их неправильно используете, и похоже, что Apple их больше не использует.

person Sulthan    schedule 17.09.2013
comment
Вы случайно не знаете, где задокументированы входы/выходы/входы и т.д.? Они все еще присутствуют в предварительно обработанном выводе, поэтому это должны быть ключевые слова компилятора, а не макросы, но я не смог найти официальную ссылку. - person Martin R; 17.09.2013
comment
@MartinR Я тоже. Вероятно, они использовались только для распределенных объектов, см. stackoverflow.com/questions/5609564/ - person Sulthan; 17.09.2013