Не-ARC в ARC: указатель на указатель на объект (**)

Я пытаюсь преобразовать проект iOS в ARC.

Я использую флаг компилятора для некоторых файлов.

Но один из файлов содержит переменную, объявленную в методе, подобно следующему:

aClass **obj;

При выключенном ARC выдает ошибку:

"указатель на неконстантный тип без явного владения"

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

aClass *__strong* obj;

Что я считаю не очень хорошей практикой в ​​отношении собственности.

Но ошибки не было в среде, отличной от ARC.

Мой вопрос заключается просто в следующем:

Как мне перейти с не-ARC на настройку ARC для объявления объекта без использования *__strong*?

то есть, как я мог объявить (или внести изменения в объявление) aClass **obj в ARC без необходимости использовать *__strong*, о чем я уверен, что где-то читал, что это не очень хорошая практика, но я забыл, где я это читал.

И:

Почему это не дало ошибки в среде, отличной от ARC.


person Unheilig    schedule 03.07.2014    source источник
comment
Некоторый контекст был бы полезен. Что присваивается переменной, где и как она используется, область действия, время жизни, ...?   -  person Martin R    schedule 03.07.2014
comment
@MartinR Он объявляется внутри метода, а затем передается другому методу в качестве параметра. Это написано не мной. У меня нет кода под рукой, иначе я мог бы опубликовать больше. Но моя память верна. Он объявляется внутри метода, а затем передается другому методу в качестве параметра. Спасибо.   -  person Unheilig    schedule 03.07.2014
comment
Указатель double передается другому методу или объект? Этот другой метод устанавливает переменную? Где он установлен изначально? Что вы делаете с ним после возврата другого метода?   -  person jscs    schedule 03.07.2014


Ответы (1)


TL;DR: вам, вероятно, не нужен указатель на указатель, если вы не можете этого избежать. Это довольно плохой дизайн для системы, в которой память управляется за вас. Этот ответ объясняет больше: Указатель на указатель в target-c? .

Подробнее

При отсутствии ARC система оставляет сохранение/выпуск на ваше усмотрение, поэтому не имеет значения, кому принадлежит указатель. Вы, программист, владеете им. В стране ARC система должна знать, когда сохранять или освобождать, и она не всегда может сделать вывод, какой класс/объект владеет конкретным объектом. Другим классам может понадобиться ссылка, но класс, объявивший ее, уже работает с объектом. По сути, __strong сообщает объявляющему классу, что он должен отвечать за управление указателем. В некотором роде он «отменяет» владение указателем. Так что это способ обойти это. Лучший способ обойти это - реорганизовать код, чтобы не использовать явно управляемую память, но то, как вы это исправили, будет работать, если это невозможно/слишком сложно.

person Dylan Gattey    schedule 03.07.2014
comment
Я не минусовал, но это действительно плохой ответ, связанный, я думаю, с плохим пониманием управления памятью и когда нужен указатель на указатель. Назвать что-то, чего вы не понимаете, довольно плохим дизайном, скорее всего, вы получили отрицательный голос. - person Leo Natan; 21.12.2015