2012-01-17 75 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