std::unique_ptr 作为目标 c 中的 @property

Moh*_*eia 5 objective-c shared-ptr unique-ptr ios

如何在 Objective C 类的接口部分定义 std::unique_ptr 的 @property ?

@property std::unique_ptr<MyClass> ptr;
Run Code Online (Sandbox Code Playgroud)

但我可以定义一个共享指针!

如果我定义唯一指针,则会出现以下错误:

无法赋值,因为其复制赋值运算符被隐式删除

Nat*_*ael 3

属性综合是这里的罪魁祸首。当您声明 时@property unique_ptr<MyClass>,编译器会隐式创建 setter 和 getter 函数以及支持变量。

set 函数可能看起来像这样:

-(void) setPtr:(std::unique_ptr<MyClass>)ptr {
    _ptr = ptr;
}
Run Code Online (Sandbox Code Playgroud)

set 函数中的该行调用 std::unique_ptr 的复制赋值运算符,该运算符被有意删除,因为 std::unique_ptr 使用移动语义。请记住,您无法复制 unique_ptr,只能将所有权从一个实例转移到另一个实例。

为了解决这个问题,您要么需要定义自己的 set 并获取尊重移动语义的函数,要么需要直接使用 ivar。

这是一个可以正常工作的示例集函数。

-(void) setPtr:(std::unique_ptr<MyClass>)ptr {
    _ptr = std::move(ptr);
}
Run Code Online (Sandbox Code Playgroud)