ARC / ObjC ++: объект C ++ внутри контейнера ObjC - PullRequest
3 голосов
/ 17 января 2012

Рассмотрим:

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?

1 Ответ

5 голосов
/ 17 января 2012

Это будет работать, но вы можете рассмотреть несколько других подходов, чтобы избежать NSValue:

  • Создать упаковщик ObjC, который управляет одним экземпляром SomeCppClass (иудаляет только этот один объект в его dealloc).Это может сделать их немного проще во многих случаях (автоматическое преобразование std::string в NSString в средствах доступа и т. Д.). Это в основном то, что NSValue делает для вас, но вы получаете гораздо большую гибкость, создаваяваш собственный класс.Обычно это мой предпочтительный подход.

  • Храните объекты C ++ в контейнере C ++, таком как vector, и тогда вам просто нужно удалить vector, и легче вытащить вещи,Вы можете использовать shared_ptr для помещения не копируемых объектов в vector.Это понятно, если вам не нужны служебные данные STL и shared_ptr, но они легко доступны в Какао.

...