2012-01-17 74 views
3

内对象考虑:ARC/ObjC++:C++的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 

这是正确的做法,删除C++的地面物体,当你与他们ARC下完成的?

回答

5

这是可行的,但你可以考虑一些其他方法来避免NSValue

  • 创建管理的SomeCppClass单个实例(并在其dealloc只删除一个对象的ObjC包装)。这可以使它们在许多情况下更容易处理(自动将std::string转换为访问器中的NSString等)。这基本上是NSValue为您所做的,但您通过创建自己的自定义类获得更大的灵活性。这通常是我首选的方法。

  • 将C++对象存储在C++容器中,如vector,然后您只需要删除vector,这样更容易。您可以使用shared_ptr将不可复制的对象放入vector。这是可以理解的,如果你不想要STL和shared_ptr的开销,但它们很容易在Cocoa中获得。

+0

感谢您的回答。你能否详细说明“更多灵活性”一点? – verec 2012-01-17 17:33:30

+2

创建您自己的每个实例包装器可让您像处理ObjC对象一样处理C++对象。它可以让你把它放到集合中,而不用担心内存管理。它允许你从中获取ObjC类型(特别是'NSString')。我强烈建议保持ObjC和C++代码尽可能分离,只有一层薄薄的ObjC++来粘合它们。这些对象包装就是那个胶水。 – 2012-01-17 18:03:07