C++对象作为 Objective-C++ 属性
C++ object as an Objective-C++ property
我想在我的 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
作为属性,你应该很好。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- C++概念:如何使用'concept'检查模板化结构的属性?
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 通过指向指针数组的指针访问子类的属性
- MSVC是否支持C++11样式的属性而不是__declspec
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 类的C++属性似乎已重新初始化
- Qt Quick-如何仅从c++代码与qml属性交互
- 用概念检查属性的类型
- 如何将数组从Objective-C发送到C++函数
- C++如何将同一类的实例作为属性
- 按多个属性排序
- 主函数参数的属性
- "perf_event_attr"结构的"read_format"属性的选项到底是什么?
- C++删除未使用的类属性会导致 std::logic_error
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 使用内存地址访问结构的属性值
- C++调用具有 *this 属性的单个帮助程序函数
- C++对象作为 Objective-C++ 属性
- 在c++中有类似objective c的属性吗?