Использование C++ из Objective C: как выделить/освободить?

В настоящее время мои классы Objective C используют объекты C++, выполняя new при создании владельца и вызывая delete при его уничтожении. Но есть ли другой способ? Я хотел бы иметь возможность объявить, скажем, auto_ptr, область действия которого длится в течение времени жизни класса Objective C.


person Dmitri Nesteruk    schedule 12.11.2008    source источник


Ответы (3)


Хорошо, позвольте мне предположить, что вы используете C++ и Objective-C на Mac, если я прав, вы, вероятно, используете X-code. Итак, если вы перейдете к свойствам (информации) вашего проекта. Вы можете проверить параметры компиляции (GCC). Там есть возможность включить конструкторы/деструкторы C++ (которые по умолчанию отключены в проектах Cocoa).

Затем вы получаете область видимости C++ по умолчанию, однако я не использовал ее много, и у меня были проблемы с кодом с большим количеством шаблонов (Boost).

Также я не думаю, что кто-то официально поддерживает это, кроме нескольких добрых душ, работающих над GCC. Поэтому я бы порекомендовал вам модульное тестирование чего-либо подобного и имейте в виду, что что-то может пойти не так.

Тем не менее, возможность использовать C++ в Objective-C для меня как человека, работающего с C++, является облегчением, и риски стоят преимуществ :)

person Robert Gould    schedule 12.11.2008

Если у вас есть хоть малейшая надежда сохранить то немногое здравомыслие, которое оставили мы, разработчики, вы этого не сделаете. Лучше всего delete ваши объекты C++. В общем, хотя безопасно смешивать Objective-C и C++ построчно, не ожидайте, что среда выполнения будет поддерживать такие необычные вещи, как смешивание времени жизни. В общем, вы можете безопасно уничтожать свои объекты, когда вызывается Dealloc вашего класса obj-c, но кроме этого, не ожидайте смешивания области класса и не плачьте.

person wisequark    schedule 12.11.2008

В Xcode я читаю «Язык программирования Objective-C», раздел под названием «Использование C++ с Objective-C». Я не пробовал, но написано, что вы можете использовать классы C++ в качестве переменных экземпляра. Он использует конструктор с нулевым аргументом для инициализации любых переменных экземпляра, являющихся классами C++. В Dealloc деструкторы вызываются в обратном порядке объявления переменных экземпляра.

Я только что наткнулся на OCPtr и комментарий к Boost::shared_ptr с Cocoa. Оба используют интеллектуальный указатель подсчета ссылок (тот, который управляет всем подсчетом ссылок для вас для операторов назначения и т. д.).

person Alan Kent    schedule 21.01.2011