iOS5中强弱存储的说明

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

不同之处在于,只要没有指针,对象就会被释放.即使弱指针指向它,一旦最后一个强指针消失,对象将被释放,所有剩余的弱指针将被清零.

也许一个例子是有序的.

想象一下,我们的对象是一只狗,狗想要逃跑(被解除分配).

强壮的指针就像是狗的皮带.只要你的皮带附着在狗身上,狗就不会逃跑.如果五个人将他们的皮带连接到一只狗,(五个强指针指向一个物体),那么在所有五个皮带脱落之前,狗不会逃跑.

另一方面,弱点就像小孩子指着那只狗说"看!一只狗!" 只要狗仍然在皮带上,小孩子仍然可以看到狗,他们仍然会指向它.然而,一旦所有的皮带脱落,无论有多少小孩指着它,狗都会跑开.

一旦最后一个强指针(皮带)不再指向一个对象,该对象将被释放,并且所有弱指针都将被清零.

  • +1优秀的例子.它是Hillegass关于皮带如何保留/释放的例子的衍生物,但我喜欢这种适应强弱的. (14认同)
  • 另一个好的是氦气球:只要至少有一根绳子,它就不会飘走了.皮带/气球类比也擅长让人们忘记"所有权"由保留/释放管理. (5认同)
  • 尼斯.Hillegass? (3认同)
  • 这是基于苹果公司Malcom Crawford几年前的类比.不知道他在哪里得到它. (2认同)
  • @DaveDeLong:嗯,他们在10.6的ARC上是*非法*.你完全不能使用它们.所以这有点无关紧要. (2认同)

mat*_*way 34

这两个定义不是一样的.

绝对不.您指出的两个定义的主要区别在于"只要其他人".重要的是"别人".

考虑以下:

__strong id strongObject = <some_object>;
__weak id weakObject = strongObject;
Run Code Online (Sandbox Code Playgroud)

现在我们有两个指针<some_object>,一个是强者,一个是弱者.如果我们设置strongObjectnil像现在这样:

strongObject = nil;
Run Code Online (Sandbox Code Playgroud)

然后,如果你遵守你概述的规则,那么你会问自己这些问题:

  1. 强:"把它放在堆里直到我不再指向它了"

    strongObject不再指向<some_object>了.所以我们不需要保留它.

  2. 弱点:"只要别人强烈指出它就保持这种状态"

    weakObject仍然指向<some_object>.但是,由于没有其他人指出它,这条规则也意味着我们不需要保留它.

结果是<some_object>取消分配,如果您的运行时支持它(Lion和iOS 5向上),那么weakObject将自动设置为nil.

现在考虑如果我们设置发生了什么weakObjectnil,像这样:

weakObject = nil;
Run Code Online (Sandbox Code Playgroud)

然后,如果你遵守你概述的规则,那么你会问自己这些问题:

  1. 强:"把它放在堆里直到我不再指向它了"

    strongObject确实指向<some_object>.所以我们确实需要保留它.

  2. 弱点:"只要别人强烈指出它就保持这种状态"

    weakObject不指向<some_object>.

其结果是,<some_object>不是重新分配的,但weakObject将是nil指针.

[请注意,所有假设<some_object>并未通过其他地方的其他强引用/某些其他方式"持有"指向]