首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >作为对象的C++对象-C++属性

作为对象的C++对象-C++属性
EN

Stack Overflow用户
提问于 2018-08-28 18:17:10
回答 2查看 3.1K关注 0票数 4

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

我应该把它设置成什么样的属性?strongretain似乎会导致错误,说明它不是对象。

我怎样才能妥善管理它的记忆呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-30 03:34:40

您是对的,属性不能是weakstrongretained;因为它必须是一个指向object对象的指针。如果您不对C++属性使用任何属性,它将默认为unsafe_unretained,assign,atomic

假设object (++)对象控制C++属性的生存期,还需要考虑其他几点:

  • 因为在object中不能对C++对象做很多事情,所以 属性在Objective++代码中非常有用,可以混合使用。 目的:C和C++。
  • 因为您必须自己管理属性的内存,所以需要一个自定义的setter。
  • 因为属性默认为atomic,所以您需要在setter中使用同步,并且也需要一个自定义getter。您可以声明它为nonatomic,在这种情况下,您不需要同步,也不需要自定义getter。
  • 您可以实现dealloc,以确保在对象- C++对象离开时释放C++对象。

以下是来自苹果的一些有用的文档:https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html

下面是一个简单的例子。假设您为该属性使用的C++类称为MyCPP。在标题中,您可以拥有:

代码语言:javascript
复制
@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

实现可以如下所示(在.mm文件中;请记住,它的目标是-C++):

代码语言:javascript
复制
@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
票数 11
EN

Stack Overflow用户

发布于 2018-08-28 22:06:44

IIRC,您需要像任何其他C++对象一样管理它,所以只需使用assign作为属性,您就应该很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52064094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档