読者です 読者をやめる 読者になる 読者になる

Objective-CでC++のコンストラクタとデストラクタが呼ばれるようにする方法

Objective-C++

Xcode(GCC)には、「Call C++ Default Ctors/Dtors in Objective-C」というオプションがあります。


これを ON にすると、 Objective-C のクラスメンバに C++ クラスオブジェクトを持ったときに
C++ クラスオブジェクトのコンストラクタとデストラクタが呼ばれるようになります。

#import <Cocoa/Cocoa.h>
#include <iostream>

using namespace std;

// C++
struct CppHoge {
    CppHoge()
    {
        cout << "constructor" << endl;
    }

    void cppFoo() const
    {
        cout << "cppFoo" << endl;
    }

    ~CppHoge()
    {
        cout << "destructor" << endl;
    }
};

// Objective-C
@interface ObjcHoge : NSObject {
    CppHoge cpp_;
}

- (id)init;

@end

@implementation ObjcHoge

- (id)init
{
    if (self = [super init]) {
        cout << "init" << endl;
    }
    return self;
}

- (void)objcFoo
{
    cout << "objcFoo" << endl;
    cpp_.cppFoo();
}

- (void)dealloc
{
    cout << "dealloc" << endl;
    [super dealloc];
}

@end


int main()
{
    ObjcHoge* p = [[ObjcHoge alloc] init];
    [p objcFoo];
    [p dealloc];
}
constructor
init
objcFoo
cppFoo
dealloc
destructor

今まではこのオプション使ってなかったので、 C++ クラスオブジェクトをポインタにして new/delete してました。。。