Я согласен с Кевином Баллардом: вам следует добавлять префиксы к именам методов вашей категории, особенно если вы собираетесь распространять их среди других. Но у вас есть действительное опасение, что анализатор будет сбит с толку DScopy
. Компилятор ARC также будет сбит с толку, если определение / реализация DScopy
выполняется без ARC и используется другим классом, использующим ARC (или наоборот).
Мое предпочтительное решение - использовать «аннотации передачи права собственности», например:
NS_RETURNS_NOT_RETAINED
NS_RETURNS_RETAINED
Они будут использоваться для переопределения поведения компиляторов по умолчанию при чтении имен методов и воздействии на них. Вы можете объявить DScopy
следующим образом: ( Это объявление должно быть в заголовочном файле, который импортируется всеми классами, которые используют этот метод , упомянутый по ссылке)
-(DSManagedObject *)DScopy; NS_RETURNS_RETAINED;
Источник для NS_RETURNS...
WWDC 2011, Сессия 322 - Достижения Objective-C в глубине. Мясо этого вопроса начинается примерно в 9: 10.
Примечание о "Но я знаю, что Apple теперь хочет зарезервировать все двухсимвольные префиксы для себя". В качестве личного предпочтения я предпочитаю использовать символ _
для отделения префикса от имени, он мне подходит. Вы можете попробовать что-то вроде:
-(DSManagedObject *)ds_copy; NS_RETURNS_RETAINED;
Это даст вам три символа и, возможно, сделает имя метода более читабельным.
Редактировать В ответ на ссылку, размещенную в комментарии.
Однако, поскольку ответ Джастина на ваш первоначальный вопрос говорит, что это может быть сломано.
Что касается атрибутов; Я не предложил использовать __attribute__((objc_method_family(copy)))
Я предложил использовать NS_RETURNS_RETAINED
, что означает: __attribute__((ns_returns_retained))
. Хотя первый пример там даже не будет компилироваться (как он говорит) с использованием - (NSString *)string __attribute__((objc_method_family(copy)));
, он компилируется с - (NSString *)string; NS_RETURNS_RETAINED;
просто отлично.
Очевидно также, что если NS_RETURNS_..
"скрыты" от компилятора в отдельных .m
или перенаправлены каким-либо другим способом и компилятор не может видеть директивы, тогда он не будет работать. В связи с этим я бы предложил поместить объявление для любых методов, которые могут вызвать путаницу анализатора / компилятора в вашем основном файле .h
(тот, который импортирует все остальные), чтобы ограничить вероятность возникновения проблемы.