C++对象作为Objective-C++属性

4
我想在我的Objective-C类中声明一个C++属性。应该设置什么样的属性?似乎strongretain会导致错误,提示它不是一个对象。我该如何正确地管理其内存?

如果可能的话,一个简短完整的例子会很有帮助。听起来你的问题不仅仅是要使用哪些属性,而是更广泛的:如何管理C++对象的内存。C++对象是否由Objective-C类拥有?Objective-C类实际上是否为Objective-C++?在Objective-C(而不是Objective-C++)代码中,你对C++对象所能做的事情是有限制的。 - Anatoli P
2个回答

12
你是对的,该属性不能是weakstrongretained;否则它必须是指向Objective-C对象的指针。如果在C++属性上不使用任何属性,则默认为unsafe_unretained,assign,atomic
还有一些其他需要考虑的事情,假设Objective-C(++)对象控制C++属性的生命周期:
- 由于在Objective-C中无法对C++对象进行太多操作,因此该属性在Objective-C++代码中非常有用,可以混合使用Objective-C和C++。 - 由于必须自己管理属性的内存,因此需要自定义setter。 - 由于属性默认为atomic,因此需要在setter中使用同步,并且还需要自定义getter。也可以将其声明为nonatomic,这样就不需要同步,也不需要自定义getter。 - 可以实现dealloc来确保在Objective-C++对象消失时释放C++对象。
以下是Apple提供的一些有用文档:https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html

以下是一个快速的示例。假设您正在使用的属性的C++类名为MyCPP。在头文件中,您可以有:

@interface ClassOCPP : NSObject

// This property can only be used in Objective-C++ code
#ifdef __cplusplus
@property /*(unsafe_unretained,assign,atomic)*/ MyCPP * myCPP;
#endif

// Other stuff may be usable in regular Objective-C code.

@end

实现如下(在 .mm 文件中;记住,它是 Objective-C++):

@implementation ClassOCPP
{
    MyCPP * _myCPP;
}
-(id)init {
    self = [super init];
    _myCPP = NULL;
    return self;
}

-(void)setMyCPP:(MyCPP*)newVal {
    @synchronized(self) {
        delete _myCPP;  // it's OK to delete a NULL pointer
        _myCPP = newVal;
    }
}

-(MyCPP*)myCPP {
    return _myCPP;
}

-(void)dealloc {
    puts("De-allocating ClassOCPP.");
    delete _myCPP;
}

@end

1
据我所知,您需要像处理其他C++对象一样管理它,因此只需使用assign作为属性即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接