Помимо распределенных объектов, одна из этих аннотаций, по-видимому, используется ARC.Я обнаружил следующее в описании clang передачи в выходной параметр путем обратной записи :
Если параметр не является параметром метода Objective C, помеченным out
, то *p
читается, а результат записывается во временную с примитивной семантикой.
Это связано с такими методами, как - (BOOL)executeWithError:(out NSError **)error
.
Игнорирование ключевого слова out
,ARC имеет четко определенное поведение обработки объекта ссылки путем передачи __autoreleasing
, поэтому ARC обрабатывает параметр error
как имеющий тип NSError * __autoreleasing *
.Если вы используете другую квалифицированную переменную, ARC добавит в функцию временный проход переменной автоматического высвобождения (для согласованности):
Исходный код
NSError *error;
[obj executeWithError:&error];
Псевдотрансформированный код
NSError * __strong error;
NSError * __autoreleasing temp;
temp = error;
[obj executeWithError:&temp];
error = temp;
При использовании приведенного выше кода строка temp = error
не понадобится, если мы каким-то образом узнаем, что temp
никогда не будет прочитано.Здесь вступает в игру аннотация out
.Согласно приведенному описанию, если out
отсутствует, компилятор должен добавить строку temp = error
, но если он содержит out
, он может исключить строку и сделать код немного меньше / быстрее.С out
преобразованный код становится:
NSError * __strong error;
NSError * __autoreleasing temp;
[obj executeWithError:&temp];
error = temp;
Конечно, если вас беспокоит размер и скорость двоичного файла, вам следует просто написать следующее:
NSError * __autoreleasing error;
[obj executeWithError:&error];
Вполне возможно, что эти аннотации используются в других местах по всему компилятору и во время выполнения и могут быть использованы в других местах в будущем.Лично мне нравится использовать out
как подсказку другим разработчикам, что я не собираюсь читать значение.