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



我想在我的 Objective-C 类中声明一个 C++ 属性。

我应该将其设置为哪种属性?似乎strongretain会导致错误,指出它不是对象。

如何正确管理其内存?

你是对的,这个属性不能是weakstrongretained;为此,它必须是指向Objective-C对象的指针。 如果不对 C++ 属性使用任何属性,它将默认为unsafe_unretained,assign,atomic

假设 Objective-C(++( 对象控制 C++ 属性的生存期,需要考虑其他一些事项:

因为在 Objective-C 中你不能
  • 对C++对象做太多事情,所以该
    属性在 Objective-C++ 代码中很有用,您可以在其中混合使用
    Objective-C 和 C++。
  • 因为您必须自己管理属性的内存,所以您 需要一个定制的二传手。
  • 由于该属性默认为atomic,因此需要使用 在二传器中同步,也需要一个自定义的吸气器。 你 可以nonatomic声明它,在这种情况下,您不需要 同步,不需要自定义 getter。
  • 您可以实现dealloc以确保在以下情况下释放C++对象 目标C++对象消失。

以下是苹果的一些有用文档: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

IIRC,你需要像管理任何其他C++对象一样管理它,所以只需使用assign作为属性,你应该很好。

最新更新