[英]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.