KMC*_*KMC 114 memory-management ios5 automatic-ref-counting
我是iOS5开发新手并使用objective-c.我无法理解强存储和弱存储之间的区别.我已经阅读了文档和其他SO问题,但它们听起来与我完全相同,没有进一步的见解.
我阅读了文档:Transitioning To ARC - 它引用了iOS4的retain,assign和release条件; 这让我很困惑.然后我看看Open U CS193p,它区分强弱:
强者:"把它保持在堆中,直到我不再指向它为止"
弱:"只要别人强烈地指出它就保持这种状态"
是不是两个定义相同=如果指针不再指向一个对象,那么释放持有该对象的内存?我理解指针,堆,分配或释放内存的概念 - 但强弱之间有什么区别?
BJ *_*mer 509
不同之处在于,只要没有强指针,对象就会被释放.即使弱指针指向它,一旦最后一个强指针消失,对象将被释放,所有剩余的弱指针将被清零.
也许一个例子是有序的.
想象一下,我们的对象是一只狗,狗想要逃跑(被解除分配).
强壮的指针就像是狗的皮带.只要你的皮带附着在狗身上,狗就不会逃跑.如果五个人将他们的皮带连接到一只狗,(五个强指针指向一个物体),那么在所有五个皮带脱落之前,狗不会逃跑.
另一方面,弱点就像小孩子指着那只狗说"看!一只狗!" 只要狗仍然在皮带上,小孩子仍然可以看到狗,他们仍然会指向它.然而,一旦所有的皮带脱落,无论有多少小孩指着它,狗都会跑开.
一旦最后一个强指针(皮带)不再指向一个对象,该对象将被释放,并且所有弱指针都将被清零.
mat*_*way 34
这两个定义不是一样的.
绝对不.您指出的两个定义的主要区别在于"只要其他人".重要的是"别人".
考虑以下:
__strong id strongObject = <some_object>;
__weak id weakObject = strongObject;
Run Code Online (Sandbox Code Playgroud)
现在我们有两个指针<some_object>,一个是强者,一个是弱者.如果我们设置strongObject到nil像现在这样:
strongObject = nil;
Run Code Online (Sandbox Code Playgroud)
然后,如果你遵守你概述的规则,那么你会问自己这些问题:
强:"把它放在堆里直到我不再指向它了"
strongObject不再指向<some_object>了.所以我们不需要保留它.
弱点:"只要别人强烈指出它就保持这种状态"
weakObject仍然指向<some_object>.但是,由于没有其他人指出它,这条规则也意味着我们不需要保留它.
结果是<some_object>取消分配,如果您的运行时支持它(Lion和iOS 5向上),那么weakObject将自动设置为nil.
现在考虑如果我们设置发生了什么weakObject来nil,像这样:
weakObject = nil;
Run Code Online (Sandbox Code Playgroud)
然后,如果你遵守你概述的规则,那么你会问自己这些问题:
强:"把它放在堆里直到我不再指向它了"
strongObject确实指向<some_object>.所以我们确实需要保留它.
弱点:"只要别人强烈指出它就保持这种状态"
weakObject不指向<some_object>.
其结果是,<some_object>是不是重新分配的,但weakObject将是nil指针.
[请注意,所有假设<some_object>并未通过其他地方的其他强引用/某些其他方式"持有"指向]