[英]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 ++属性的生命周期,还需要考虑其他一些事项:
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
IIRC,你需要像任何其他C ++对象一样管理它,所以只需使用assign
作为属性,你应该很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.