我想在我的 Objective-C 类中声明一个 C++ 属性。
我应该将其设置为哪种属性?似乎strong
或retain
会导致错误,指出它不是对象。
如何正确管理其内存?
你是对的,这个属性不能是weak
、strong
或retained
;为此,它必须是指向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
作为属性,你应该很好。