Objective-Cのクラスを構造体やC++のクラスで保持する方法【Objective-C++】

通常のObjective-Cでは、構造体のメンバ変数としてObjective-Cのクラスを保持することができませんでした。

/* ObjC.m */
struct Cpp {
  NSString *str; // ERROR: ARC forbids Objective-C objects in struct
};

Objective-C++ではそれが可能となります。

/* ObjCpp.mm */
@interface ObjCpp : NSObject @end
@implementation ObjCpp @end

struct Cpp {
  NSString *str; // OK
  ObjCpp *objc;  // OK
};

ARCによるメモリ管理もしっかりと効きます。

if (true) {
  Cpp a = {@"str", [ObjCpp new]};
}
// ObjCppオブジェクトは解放済み
C++側のデストラクタが呼ばれるタイミングで、Objective-C側の参照カウントが自動的に増減されます。またObjCオブジェクトがC++側のコンストラクタに渡った際にも同様に参照カウントの増減が行われます。
/* main.cpp */
auto main() -> int {
  {
    Cpp a;
    {
      id xxx = [ObjCpp new];
      Cpp b = {xxx};
      a.objc = b.objc;
    } // xxxはaに保持されているため、まだ解放されない
  } // xxxは解放される( -[ObjCpp dealloc] も呼ばれる)
}

広告