簡體   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