std :: unique_ptr作为目标c

时间:2015-04-22 13:26:33

标签: ios objective-c shared-ptr unique-ptr

如何在目标c类的接口部分定义std :: unique_ptr的@property?

@property std::unique_ptr<MyClass> ptr;

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

如果我定义了唯一指针,那么我得到错误:

  

因为其复制赋值运算符而无法分配   隐式删除

2 个答案:

答案 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]


参考

  1. 使用Xcode 4.4自动合成属性
    https://useyourloaf.com/blog/property-synthesis-with-xcode-4-dot-4/

  2. 目标C,编码和您
    https://medium.com/@dmaclach/objective-c-encoding-and-you-866624cc02de