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