C++ 目标-C弧指针所有权与C++;

C++ 目标-C弧指针所有权与C++;,c++,objective-c,memory-management,automatic-ref-counting,C++,Objective C,Memory Management,Automatic Ref Counting,假设我有一个高级类实例化一个对象,然后将其传递给一个低级类: - (void) doSomeStuff { MyBusinessObject* obj = [[MyBusinessObject alloc] init]; [obj setFoo:@"bar"]; [dataManager takeObj:obj withKey:@"abc" andKey:@"def"]; } 然后在takebj的实现中,我想保留两个不同的字典 - (void) takeObj:(MyB

假设我有一个高级类实例化一个对象,然后将其传递给一个低级类:

- (void) doSomeStuff {
    MyBusinessObject* obj = [[MyBusinessObject alloc] init];
    [obj setFoo:@"bar"];
    [dataManager takeObj:obj withKey:@"abc" andKey:@"def"];
}
然后在
takebj
的实现中,我想保留两个不同的字典

- (void) takeObj:(MyBusinessObject*)obj withKey:(NSString*)key1 andKey:(NSString*)key2 {
    [primaryDict setObject:obj forKey:key1];
    [secondaryDict setObject:obj forKey:key2];
}
现在,我想要的是将
obj
的所有权传递给我的数据管理器,并让
primaryDict
持有强引用和
secondaryDict
持有弱引用。这就是我在C++中的实现方式:

map<string, unique_ptr<MyBusinessObject>> primaryDict;
map<string, MyBusinessObject*> secondaryDict;
map-primaryDict;
地图二级目录;
takebj
函数将接受一个
unique\u ptr
,它将与
std::move
一起传递。然后将其再次移动到
primaryDict
中,并在
secondaryDict
中添加带有原始指针的弱引用


我的问题是——告诉Objective-C ARC系统以这种方式管理我的引用的正确方法是什么?

那么,带有
-takebj:…
方法的实例在传入后拥有
obj
?如果它有两个强有力的参照物而不是一个,那又有什么关系呢?简而言之,只需使用
NSMutableDictionary
,并让这两个字典都有对
obj
的强引用。对于这一点没有任何明显的性能损失,基础集合没有内置的对弱引用进行零化的支持,所以如果这是“弱”的意思,那么无论如何都是你自己的。

,那么,在<> OuttoObj:……/>代码>的方法在传递到代码后拥有“代码> Obj/<代码>的实例?如果它有两个强有力的参照物而不是一个,那又有什么关系呢?简而言之,只需使用

NSMutableDictionary
,并让这两个字典都有对
obj
的强引用。对于这一点没有任何明显的性能损失,而且基础集合没有内置的对弱引用进行零化的支持,所以如果这是“弱”的意思,那么无论如何都是你自己的。

使用NSMAPABLE,而不是NS字典来保存你的弱引用。检查,特别是有关NSMapTableOptions的部分

您可以使用与NSDictionary相同的行为创建映射表,但通过以下方式初始化,对值的引用较弱:

[NSMapTable mapTableWithKeyOptions:NSMapTableCopyIn valueOptions:NSMapTableWeakMemory]
这是Obj-C等效于:

std::map<std::string, std::weak_ptr<MyBusinessObject>>
std::map
这些值将不会被保留,并且当对象解除分配时,引用将自动设置为nil。但是表条目没有被删除,因此您可能希望检查具有nil值的条目,并根据需要的不同键的数量不时删除它们


请注意,除非您需要循环引用或正在实现缓存之类的东西,否则通常没有理由这样做。一个强引用就像C++中的“代码> STD::SyrdYPPTR <代码>,Objtovi-C中的约定是共享对单个对象的引用而不是与单个所有者复制/移动(如果您尝试不同地使用它,最终会与语言/框架发生冲突)。

使用NSMAPABLE,而不是NSCONTRORY来保存您的弱引用。检查,特别是有关NSMapTableOptions的部分

您可以使用与NSDictionary相同的行为创建映射表,但通过以下方式初始化,对值的引用较弱:

[NSMapTable mapTableWithKeyOptions:NSMapTableCopyIn valueOptions:NSMapTableWeakMemory]
这是Obj-C等效于:

std::map<std::string, std::weak_ptr<MyBusinessObject>>
std::map
这些值将不会被保留,并且当对象解除分配时,引用将自动设置为nil。但是表条目没有被删除,因此您可能希望检查具有nil值的条目,并根据需要的不同键的数量不时删除它们

请注意,除非您需要循环引用或正在实现缓存之类的东西,否则通常没有理由这样做。在C++中,强引用就像是<代码> STD::SysDypPTR <代码>,Objtovi-C中的约定是共享对单个对象的引用,而不是与单个所有者复制/移动(如果您尝试以不同的方式来处理,则最终会与语言/框架发生冲突)。