2012-01-17 8 views
3

内部のC++オブジェクトは、考えてみましょう:ARC /にObjC++:にObjCコンテナ

class SomeCppClass { 
public: 
    SomeCppClass() {} ; 
    ~SomeCppClass() {} ; 
} ; 

@interface Test1 : NSObject 

- (id) init ; 

@property (strong, nonatomic) NSMutableArray * container ; 

@end 

@implementation Test1 

@synthesize container ; 

- (id) init { 
    if (self = [super init]) { 
     container = [NSMutableArray arrayWithCapacity:10] ; 
     [container addObject:[NSValue valueWithPointer:new SomeCppClass()]] ; 
    } 
    return self ; 
} 

- (void) dealloc { 
    for (NSValue * v in container) { 
     SomeCppClass * c = (SomeCppClass *) [v pointerValue] ; 
     delete c ; 
    } 
} 
@end 

が、これはあなたがARCの下で彼らと終わったらC++土地のオブジェクトを削除するための正しいアプローチですか?

答えて

5

これは動作しますが、あなたはNSValueを避けるために、他のアプローチのカップルを考慮することができる:

  • SomeCppClassの単一のインスタンスを管理(およびそのdeallocにただ1つのオブジェクトを削除にObjCラッパーを作成します。 )。これにより、多くの場合に対処するのが少し簡単になります(アクセサーなどでstd::stringNSStringに自動的に変換します)。これは基本的にNSValueの処理ですが、独自のカスタムクラスを作成することでさらに柔軟になります。これは通常私が推奨するアプローチです。

  • vectorなどのC++コンテナにC++オブジェクトを格納してから、vectorを削除するだけで簡単に削除できます。 shared_ptrを使用してコピー不可能なオブジェクトをvectorに入れることができます。 STLとshared_ptrのオーバーヘッドを必要としない場合は分かりますが、Cocoaですぐに利用できます。

+0

ご回答ありがとうございます。あなたは "より柔軟性"のビットを詳述できますか? – verec

+2

独自のインスタンスごとのラッパーを作成すると、C++オブジェクトをObjCオブジェクトのように扱うことができます。これにより、メモリ管理を心配することなくコレクションに入れることができます。 ObjCの型を取り出すことができます(特に 'NSString')。 ObjCとC++のコードをできるだけ別々にし、ObjC++の薄いレイヤーを貼り付けることを強くお勧めします。これらのオブジェクトラッパーはその接着剤です。 –

関連する問題