Цель-C in, out, inout, byref, byval,. и так далее. Что это такое?


я обнаружил что-то незнакомое, читая руководство 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 61

4 ответа:

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

  • in: аргумент является только входным аргументом и не будет ссылка позже
  • выход: аргумент-это только выходной аргумент, используемый для возврата значения по ссылке
  • inout:

помимо распределенных объектов, одна из этих аннотаций, по-видимому, используется ARC. Я наткнулся на следующее в описании кланга переход к параметру out путем обратной записи:

если параметр не является параметром метода Objective-C с пометкой out, потом *p читается, и результат записывается во временную с примитивной семантики.

это связано с такими методами, как - (BOOL)executeWithError:(out NSError **)error.

игнорировать out ключевое слово, дуга имеет четко определенное поведение обработки по ссылке объекта, проходящего как __autoreleasing, так дуга лечит error параметр как имеющий тип NSError * __autoreleasing *. Если вы используете другую переменную, ARC добавит временную переменную автореализации в функцию (для когерентности):

исходный код

NSError *error;
[obj executeWithError:&error];

Pseudotransformed код

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 как намек другим разработчикам, что я не собираюсь читать значение.

Если кто-то наткнулся на этот пост и имеет ту же путаницу, что и я, аргумент " in " также может быть ключевым словом, которое представляет собой быстрое перечисление. Смотрите здесь для более подробной информации.

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