在上一次我试图了解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 } } }
])
引用让我们避免保留周期,为什么不一直使用它们呢?
答案 0 :(得分:3)
对象只保留在内存中,同时至少有一个强(默认)引用。如果您只使用弱引用,则会立即释放该对象。
简单地说,"弱"意思是:这个对象属于其他人,我只访问它,如果它消失,我不介意。
答案 1 :(得分:2)
由于Objective-C中的弱引用让我们避免保留周期,为什么不一直使用它们呢?
因为只要对象没有强引用就会释放一个对象。
更重要的是,通常需要强引用以防止对象的释放。例如,视图控制器最终负责其视图 - 让控制器的视图突然消失是没有多大意义的。所以UIViewController的view
属性很强。
当两个对象都具有对另一个的强引用时,会发生保留周期。只要另一个对象保持强大的引用,这两个对象都不能被释放。如果你意识到这种情况,这不是一个真正的问题,因为你可以通过消除任何一个引用来打破保留周期。但是,很容易不意识到这个循环,或忘记处理它,然后你有两个对象在内存中保持超出其使用寿命。使其中一个引用弱,消除了问题,但它也意味着引用的对象可能被释放,并且引用可能在任何时候都变为零。在实践中,这通常不是问题。