Какие семейства методов существуют в target-c / cocoa для iOS? - PullRequest
3 голосов
/ 07 января 2012

Я опытный разработчик, который является новичком в разработке iOS (в частности, для iPhone). В проекте, над которым я работаю, используется автоматический подсчет ссылок (ARC).

Я проводил некоторые исследования в области ARC и наткнулся на этот документ: http://clang.llvm.org/docs/AutomaticReferenceCounting.html, а в разделе под заголовком «Сохраненные возвращаемые значения» говорится, что атрибут может использоваться для указания того, что вызывающий объект ожидает вступления во владение. +1 сохранить счет. Далее также утверждается, что ARC автоматически добавит атрибут к методам, если обнаружит, что он принадлежит к определенным семействам методов (в частности, к именам: alloc, copy, init, mutableCopy и new)

Из дальнейшего чтения кажется, что семейства методов - это просто соглашения о присвоении имен методам. Насколько я понимаю, если имя метода начинается с семейства методов, то оно входит в это семейство методов. Так например

+(id) init
+(id) initWithName:(NSString*)name

являются частью семейства методов init.

Мой вопрос: Существует ли формальный список определенных семейств методов для разработки под iOS, и если да, то где они / где я могу его найти?

ниже находится раздел llvm.org, о котором я упоминал выше:

Раздел 3.2.2: Состояния возвращаемых значений:

Функция или метод, который возвращает тип указателя сохраняемого объекта может быть помечен как возвращающий оставшееся значение, означающее, что вызывающий ожидает получить право владения +1 удерживать счет. Это сделано добавление атрибута ns_returns_retained в функцию или метод декларация, вот так:

id foo (void) __attribute ((ns_returns_retained)); - (id) foo __attribute ((ns_returns_retained)); Этот атрибут является частью типа функции или метода.

При возврате из такой функции или метода ARC сохраняет значение в точке оценки заявления о возврате, прежде чем оставить все локальные области применения.

При получении результата возврата от такой функции или метода, ARC освобождает значение в конце полного выражения, которое оно содержит в пределах, при условии обычной оптимизации для локальных значений.

Обоснование: это формализует прямую передачу права собственности от вызываемой стороны звонящему. Наиболее распространенным сценарием этой модели является сохранение возврат из методов init, alloc, new и copy, но есть и другие случаи в рамках. После оптимизации обычно нет требуется дополнительное удержание и освобождение.

Методы в alloc, copy, init, mutableCopy и новых семействах неявно помеченный атрибут ((ns_returns_retained)). Это может быть подавляется путем явной маркировки метода атрибут ((ns_returns_not_retained)).

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

Обоснование: несоответствие с возвращенными результатами приведет к перерасходу или перерасходы, в зависимости от направления. Опять правило о вызовы функций - это на самом деле приложение существующего C / C ++ правило о вызове функций через несовместимый тип функции.

Ответы [ 4 ]

9 голосов
/ 07 января 2012

Раздел 5 того же документа называется «Семейства методов». В нем перечислены все определенные на данный момент семейства, которые вы определили выше; alloc, new, copy, mutableCopy и init. В нем также перечислены критерии принадлежности к этой семье. Главным образом, он основан на имени метода, но также зависит от типа возвращаемого значения. Например, член семейства copy должен вернуть объект; метод копирования с возвращаемым типом void не будет считаться частью семейства методов copy.

5 голосов
/ 07 января 2012

Я не знаю, что видел формальный список семейств методов, но ваш анализ в основном верен. Я считаю, что единственные соглашения о присвоении имен методам, которые имеют семантику с применением компилятора, - это те, которые упоминаются в вашем посте, а именно alloc, init, copy (и mutableCopy) и new. Даже до / без ARC статический анализатор clang, включенный в Xcode, использует эти соглашения об именах для поиска проблем управления памятью, а также они являются основой давних правил управления памятью для программистов Objective-C до ARC.

А именно, если вы создаете объект, используя метод, который начинается с init, copy, mutableCopy или new, вы «владеете» этим объектом и несете ответственность за его последующее освобождение. Объекты, созданные или возвращенные методами с любым другим именем, не принадлежат вам, вызывающей стороне, и если вы хотите сохранить ссылку на них, вы должны сохранить их. Каждое сохранение, которое вы делаете, должно быть уравновешено более поздним выпуском, когда вы закончите со ссылкой на объект. Наконец, вызов autorelease для объекта помещает его в самый внутренний пул autorelease. Пул отвечает за освобождение объекта позднее, а позднее - через некоторое время после текущей области. Таким образом, освобождение и автоматическое освобождение являются действительными способами отказа от удержания объекта.

Теперь, правила, изложенные мною, не должны (и не могут) соблюдаться вами, программистом, в ARC. Однако ARC - это система, в которой компилятор с помощью статического анализатора знает эти правила и вставляет необходимые вызовы управления памятью во время компиляции. Итак, если вы хотите лучше понять, что ARC делает закулисными, понимание этих правил - хорошее начало.

Это оказалось немного длинным, но дело в том, что названные вами методы - единственные, о которых я знаю, которые имеют это соглашение о принудительном именовании в Objective-C, и это вытекает из правил управления памятью, изложенных выше. , Конечно, в Objective-C есть и другие соглашения об именах, но они являются стандартными соглашениями по стилю, а не чем-то обязательным.

3 голосов
/ 07 января 2012

Посмотрите официальную документацию Apple Developer о Правилах управления памятью . Кажется, ваш список завершен: «alloc», «new», «copy» или «mutableCopy» (только 4 ключевых слова).

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

Я бы включил вспомогательные конструкторы, предоставляемые некоторыми классами Какао:

 - +stringWith*                        // Various ways to make NSString objects
 - +arrayWith*, +dictionaryWith*, etc. // Make collections
 - +dateWith*                          // Make NSDate objects
 - etc.                                // Many, many others

Все они возвращают новый, автоматически выпущенный экземпляр класса, в который они отправляются - за исключением некоторых особых случаев, см., Например, комментарий @Peter Hosey.

Я не знаю, существуют ли какие-либо формальные правила, но шаблон состоит в том, что имя конструктора состоит из имени класса без части NS (и без части Mutable, также для изменяемых классов) затем With<Parameter Type>: и один или несколько параметров. Имя начинается со строчной буквы (кроме обычных подозреваемых, например URLWithString:.)

Например, следующая строка предоставляет автоматически выпущенный экземпляр NSArray с одним элементом:

[NSArray arrayWithObject: @"Test"]

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

...