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