如何在目标c类的接口部分定义std :: unique_ptr的@property?
@property std::unique_ptr<MyClass> ptr;
但我可以定义一个共享指针!
如果我定义了唯一指针,那么我得到错误:
因为其复制赋值运算符而无法分配 隐式删除
答案 0 :(得分:1)
财产综合是罪魁祸首。声明@property unique_ptr<MyClass>
时,编译器会隐式创建setter和getter函数以及后备变量。
set函数可能看起来像这样:
-(void) setPtr:(std::unique_ptr<MyClass>)ptr {
_ptr = ptr;
}
set函数中的那一行调用std :: unique_ptr的复制赋值运算符,这是有意删除的,因为std :: unique_ptr使用了移动语义。请记住,您无法复制unique_ptr,您只能将所有权从一个实例转移到另一个实例。
要解决此问题,您需要定义自己的集合并获取尊重移动语义的函数,或者您需要直接使用ivar。
这是一个可正常工作的示例设置功能。</ p>
-(void) setPtr:(std::unique_ptr<MyClass>)ptr {
_ptr = std::move(ptr);
}
答案 1 :(得分:1)
作为Ref [1],编译器将为@property生成setter,getter和实例变量。
以下是没有错误编译的示例:
// .h file
@interface IOCMixCpp : NSObject
{
std::unique_ptr<int> mTotal;
}
@property (nonatomic, readonly, assign) std::unique_ptr<int> total;
@end
// .mm file
@implementation IOCMixCpp
- (instancetype)init {
self = [super init];
if (self) {
mTotal = std::make_unique<int>(9);
}
return self;
}
- (void)setTotal:(std::unique_ptr<int>)total {
mTotal = std::move(total);
}
- (std::unique_ptr<int>)total {
// This line is error free.
return std::move(mTotal);
// There is an error in the following line:
// Error: Call to implicitly-deleted copy constructor of 'std::unique_ptr<int>'
// return mTotal;
}
@end
注意:
unique_ptr应该在Objective-C类的内部使用,并且不应该使用 unique_ptr类型。
“幸运的是,编译器将阻止您执行诸如使用std :: unique_ptr声明@property之类的愚蠢操作。否则,您第一次使用self.foo访问该值时,您的类将失去对指针。”参考[2]