Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;对象作为目标-C++;财产 我想在ObjuleC类中声明C++属性。< /P>_C++_Objective C++ - Fatal编程技术网

C++;对象作为目标-C++;财产 我想在ObjuleC类中声明C++属性。< /P>

C++;对象作为目标-C++;财产 我想在ObjuleC类中声明C++属性。< /P>,c++,objective-c++,C++,Objective C++,我应该将其设置为什么类型的属性?似乎strong或retain会导致错误,说它不是对象 我如何管理内存?irc,你需要像其他C++对象一样管理它,所以只使用赋值< /C>作为属性,你应该是好的。< /P> < P>你是正确的,属性不能是代码>弱,强< /COD>,或者保留< /代码>;为此,它必须是指向Objective-C对象的指针。如果你不在C++属性上使用任何属性,它将默认为 unSaveIn保持,分配,原子< /代码>。 其他一些要考虑的事情,假设Objul-C(++)对象控制C++属性

我应该将其设置为什么类型的属性?似乎
strong
retain
会导致错误,说它不是对象


我如何管理内存?

irc,你需要像其他C++对象一样管理它,所以只使用<代码>赋值< /C>作为属性,你应该是好的。< /P> < P>你是正确的,属性不能是代码>弱,<代码>强< /COD>,或者<代码>保留< /代码>;为此,它必须是指向Objective-C对象的指针。如果你不在C++属性上使用任何属性,它将默认为<代码> unSaveIn保持,分配,原子< /代码>。

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

    因为Objto-C中C++对象没有多大作用,
    属性在Objective-C++代码中非常有用,您可以在其中混合使用
    ObjtoFe C和C++
  • 因为您必须自己管理属性的内存,所以 需要一个自定义设置器
  • 由于属性默认为
    原子属性
    ,因此需要使用 在setter中进行同步,并且还需要自定义getter。你 可以声明它是非原子的,在这种情况下,您不需要 同步,不需要自定义getter
  • 可以实现<代码> DELOLC/<代码>,以确保C++对象在释放时释放 Objective-C++对象消失了
以下是一些来自苹果的有用文档:

下面是一个简单的例子。让我们假设您使用的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
实现可以如下(在
.mm
文件中;记住,它是Objective-C++):


如果可能的话,一个简短完整的例子可能会有所帮助。听起来你的问题不仅仅是使用什么属性,而是更广泛的:如何管理C++对象的内存。是Objy-C类拥有的C++对象吗?Objective-C类实际上是Objective-C++吗?在Objy-C(不是Objul-C++)代码中,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