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

Fra*_*Joe 4 c++ objective-c++

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

我应该将它设置为什么样的属性?似乎strongorretain会导致一个错误,说它不是一个对象。

我怎样才能正确管理它的内存?

Ana*_*i P 8

你是对的,属性不能是weak, strong, 或retained; 为此,它必须是一个指向 Objective-C 对象的指针。如果您不在 C++ 属性上使用任何属性,它将默认为unsafe_unretained,assign,atomic.

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

  • 因为在 Objective-C 中你不能用 C++ 对象做很多事情,所以这个
    属性在 Objective-C++ 代码中最有用,你可以在其中混合
    Objective-C 和 C++。
  • 因为您必须自己管理属性的内存,所以您需要一个自定义的 setter。
  • 由于该属性默认为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)