我想在我的 Objective-C 类中声明一个 C++ 属性。
我应该将它设置为什么样的属性?似乎strongorretain会导致一个错误,说它不是一个对象。
我怎样才能正确管理它的内存?
你是对的,属性不能是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
Run Code Online (Sandbox Code Playgroud)
实现可能如下(在.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
Run Code Online (Sandbox Code Playgroud)