ARC を使用して構造体のオブジェクトを管理することはできません。そのメモリ管理を手動で追跡する責任があります。この方法でオブジェクトを保存することはお勧めできません。
この方法でメモリを追跡する必要がある場合は、オブジェクトを構造体に入れるときに、そのオブジェクトに対して責任があることを ARC に伝える必要があります。
context->user_data = CFBridgingRetain([[MYObjCClass alloc] init]);
これにより、ARC は によって返されたオブジェクトに対して責任を負わないことがわかり、それが所有者になるようにinit
マニュアルが追加されます。retain
context->user_data
オブジェクトの処理が完了したら、ARC に戻すか、解放することができます。ARC に戻すには:
MYObjCClass *something = CFBridgingRelease(context->user_data);
context->user_data = NULL;
これにより、ARC がオブジェクトの責任を負い、保持が削除されます。context->user_data
はこのオブジェクトを所有しなくなり、オブジェクトはいつでも消える可能性があるため、ポインターを NULL にする必要があります。
直接リリースすることもできます:
CFRelease(context->user_data);
context->user_data = NULL;
繰り返しますが、これは最後の手段です。一般に、ARC は ObjC オブジェクトを管理できないため、構造体に ObjC オブジェクトを格納しないでください。
補足として、私は一般的に ObjC++ をお勧めしませんが、これを自動化するためにデストラクタで C++ 構造体を使用することは可能です。場合によっては、これは C で手動でメモリを管理するよりも望ましい場合があります。