Objective-C in, out, inout, byref, byval, .. и так далее.Кто они такие? - PullRequest
62 голосов
/ 10 апреля 2011

Я обнаружил что-то незнакомое, читая руководство Objective-C для @encoding.

Table 6-2  Objective-C method encodings
Code Meaning
r    const
n    in
N    inout
o    out
O    bycopy
R    byref
V    oneway

Единственное, что я знаю, это oneway.Какие остальные?

Ответы [ 4 ]

83 голосов
/ 10 апреля 2011

Это аннотации для параметров метода и возвращаемых значений, которые использовались распределенными объектами. Я говорю, что были , потому что, очевидно, их больше нет в документации Apple. В документе «Язык программирования Objective-C» раньше был раздел «Удаленные сообщения», на который все еще ссылается документ «Темы программирования распределенных объектов».

  • in: аргумент является только входным аргументом и не будет ссылаться позже
  • out: аргумент - это только выходной аргумент, используемый для возврата значения по ссылке
  • inout: аргумент является входным и выходным аргументом
  • const: (указатель) аргумент является константой
  • bycopy: вместо использования прокси / NSDistantObject, передать или вернуть копию объекта
  • byref: использовать прокси-объект (по умолчанию)
23 голосов
/ 24 сентября 2013

Помимо распределенных объектов, одна из этих аннотаций, по-видимому, используется 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 как подсказку другим разработчикам, что я не собираюсь читать значение.

0 голосов
/ 25 января 2012

В случае, если кто-нибудь наткнулся на этот пост и имеет ту же путаницу, что и я, аргумент «in» также может быть ключевым словом, представляющим быстрое перечисление.Подробнее см. здесь .

0 голосов
/ 10 апреля 2011

Вы можете прочитать источники времени выполнения Objective C http://www.opensource.apple.com/source/objc4/objc4-437.1/, чтобы понять, что означают эти аннотации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...