Деструктор в Objective-C ++

У меня есть класс objective-C ++, который содержит некоторые честные указатели на объекты С++.

Когда класс Obj-С++ уничтожен, он немедленно вызывает dealloc? Если это так, то лучший способ уничтожить класс С++, поставив

delete obj

в методе dealloc?

Ответы

Ответ 1

Я предполагаю, что когда вы говорите "класс Obj-С++", вы имеете в виду класс Objective-C, который содержит некоторые классы С++.

Objective-C классы не вызывают dealloc при их уничтожении; они уничтожаются путем отправки им сообщения dealloc.

С этим ударом педантизма, если ваш метод init создает экземпляр obj, тогда да, вызовите delete obj в dealloc:

-(void)dealloc {
  delete obj;
  [super dealloc];
}

Ответ 2

В качестве дополнения к правильному ответу Фрэнка Шейрара, если вы используете OSX 10.4 или более позднюю версию SDK (и вы, вероятно, знаете, хотя я не уверен, что здесь работает iPhone), вы также можете включить членов С++ из Objective-C классы, т.е. не прибегая к указателю. Проблема в более ранних версиях OSX SDK заключалась в том, что конструктор и деструктор члена С++ просто не будут вызваны. Однако, указав параметр компилятора fobjc-call-cxx-cdtors (в XCode он отображается как параметр GCC_OBJC_CALL_CXX_CDTORS), вызовы ctor и dtor будут вызваны. См. Также Apple docs, немного ниже этой страницы.