在Objective C中拥有所有权的争议

时间:2017-03-15 15:35:57

标签: objective-c pointers reference

在上一次我试图了解Objective-C内存管理时,我曾问自己以下问题:

由于Objective-C中的db.collection.aggregate([ { "$project": { "web_images": { "$filter": { "input": { "$setUnion": [ { "$ifNull": [ "$pictures", [] ] }, { "$ifNull": [ "$logos", [] ] } ] }, "as": "p", "cond": { "$eq": [ "$$p.web", "true" ] } } } }}, { "$match": { "web_images.0": { "$exists": true } } } ]) 引用让我们避免保留周期,为什么不一直使用它们呢?

2 个答案:

答案 0 :(得分:3)

对象只保留在内存中,同时至少有一个强(默认)引用。如果您只使用弱引用,则会立即释放该对象。

简单地说,"弱"意思是:这个对象属于其他人,我只访问它,如果它消失,我不介意。

答案 1 :(得分:2)

  

由于Objective-C中的弱引用让我们避免保留周期,为什么不一直使用它们呢?

因为只要对象没有强引用就会释放一个对象。

更重要的是,通常需要强引用以防止对象的释放。例如,视图控制器最终负责其视图 - 让控制器的视图突然消失是没有多大意义的。所以UIViewController的view属性很强。

当两个对象都具有对另一个的强引用时,会发生保留周期。只要另一个对象保持强大的引用,这两个对象都不能被释放。如果你意识到这种情况,这不是一个真正的问题,因为你可以通过消除任何一个引用来打破保留周期。但是,很容易意识到这个循环,或忘记处理它,然后你有两个对象在内存中保持超出其使用寿命。使其中一个引用弱,消除了问题,但它也意味着引用的对象可能被释放,并且引用可能在任何时候都变为零。在实践中,这通常不是问题。

相关问题