繁体   English   中英

Objective-C ARC指针所有权与C ++

[英]Objective-C ARC pointer ownership vs C++

可以说我有一个实例化对象的高层类,然后将其传递给较低层的类:

- (void) doSomeStuff {
    MyBusinessObject* obj = [[MyBusinessObject alloc] init];
    [obj setFoo:@"bar"];
    [dataManager takeObj:obj withKey:@"abc" andKey:@"def"];
}

然后在执行takeObj我想保留两个不同的字典...

- (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;

takeObj函数将接受一个unique_ptr<MyBusinessObject> ,它将通过std::move向下传递。 然后将其再次移入primaryDict并在secondaryDict添加带有原始指针的弱引用。

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

使用NSMapTable而不是NSDictionary来保存您的弱引用。 检查文档 ,尤其是关于NSMapTableOptions的部分。

您可以通过初始化来创建具有与NSDictionary相同行为但对值的引用弱的映射表:

[NSMapTable mapTableWithKeyOptions:NSMapTableCopyIn valueOptions:NSMapTableWeakMemory]

这与Obj-C等效:

std::map<std::string, std::weak_ptr<MyBusinessObject>>

这些值将不会保留,并且在对象取消分配时,引用将自动设置为nil。 该表条目不会被删除,因此,您可能希望检查具有nil值的条目,并不时删除它们,具体取决于您期望多少个不同的键。

请注意,除非您需要循环引用或正在实现类似缓存的内容,否则通常没有理由这样做。 一个强大的引用就像C ++中的std::shared_ptr一样,并且Objective-C中的约定是共享对单个对象的引用,而不是与单个所有者进行复制/移动(如果您尝试以其他方式进行操作)。

那么,具有-takeObj:...方法的实例将obj传递后拥有它? 为什么用两个强引用而不是一个强引用呢? 简而言之,只需使用NSMutableDictionary并让两个字典都具有对obj强引用。 对此没有任何明显的性能损失,并且基础集合没有对弱引用清零的内置支持,因此,如果这就是您所说的“弱”,则无论如何您都会自己。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM