【问题标题】:Objective-C ARC pointer ownership vs C++Objective-C ARC 指针所有权与 C++
【发布时间】:2013-08-31 18:45:53
【问题描述】:

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

- (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&lt;MyBusinessObject&gt;,该std::move 将传递下去。然后将再次将其移动到primaryDict,并在secondaryDict 中添加一个带有原始指针的弱引用。

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

【问题讨论】:

    标签: c++ objective-c memory-management automatic-ref-counting


    【解决方案1】:

    使用 NSMapTable,而不是 NSDictionary 来保存你的弱引用。检查documentation,尤其是关于 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 中的约定是共享对单个对象的引用,而不是与单个所有者复制/移动(如果您最终将与语言/框架作斗争尝试以不同的方式进行)。

    【讨论】:

      【解决方案2】:

      那么,带有-takeObj:... 方法的实例在传入后拥有obj?如果使用两个强引用而不是一个强引用来做到这一点,为什么这很重要?简而言之,只需使用NSMutableDictionary 并让两个字典都具有对obj 的强引用。这并没有任何明显的性能损失,并且基础集合没有内置支持将弱引用归零,所以如果这就是您所说的“弱”,那么无论如何您都将独自一人。

      【讨论】:

        猜你喜欢
        • 2013-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-10
        • 1970-01-01
        • 2011-09-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多