Memory management 解释iOS5中的强存储和弱存储

Memory management 解释iOS5中的强存储和弱存储,memory-management,ios5,automatic-ref-counting,Memory Management,Ios5,Automatic Ref Counting,我不熟悉iOS5开发和使用objective-c。我很难理解strong和弱存储之间的区别。我已经阅读了文档和其他SO问题,但它们听起来都和我一样,没有进一步的见解 我阅读了对iOS4保留、分配和发布条款的it参考;这让我很困惑。然后我研究了开放式U CS193p,它区分了强弱: strong:“将其保存在堆中,直到我不再指向它” 弱:“只要有其他人强烈指向,就保存此文件” 这两个定义是否相同=如果指针不再指向对象,则释放保存该对象的内存?我理解内存的指针、堆、分配或释放的概念——但强内存和弱内

我不熟悉iOS5开发和使用objective-c。我很难理解strong存储之间的区别。我已经阅读了文档和其他SO问题,但它们听起来都和我一样,没有进一步的见解

我阅读了对iOS4保留、分配和发布条款的it参考;这让我很困惑。然后我研究了开放式U CS193p,它区分了强弱:

strong:“将其保存在堆中,直到我不再指向它”
:“只要有其他人强烈指向,就保存此文件”


这两个定义是否相同=如果指针不再指向对象,则释放保存该对象的内存?我理解内存的指针、堆、分配或释放的概念——但强内存和弱内存有什么区别

不,它们不完全相同,但非常不同。仅当需要保留对象时才使用“强”。在任何其他情况下都可以使用“弱”,这样可以知道对象是否已从堆中删除,因为没有人保留它。

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

也许可以举个例子

假设我们的目标是一只狗,而这只狗想逃跑(被释放)

强有力的指针就像狗的皮带。只要你把皮带拴在狗身上,狗就不会逃跑。如果五个人把皮带拴在一条狗身上,(五个强有力的指针指向一个物体),那么狗在五条皮带全部解开之前不会逃跑

另一方面,弱者就像小孩子指着狗说:“看!一条狗!”只要狗还在拴着皮带,小孩子仍然可以看到狗,他们仍然会指着它。然而,当所有的皮带都松开时,不管有多少小孩指着它,狗都跑开了

一旦最后一个强指针(leash)不再指向某个对象,该对象将被释放,所有弱指针都将归零

这两个定义不一样吗

绝对不是。你所指出的两个定义的关键区别是“与其他人一样长”。重要的是“其他人”

考虑以下几点:

__strong id strongObject = <some_object>;
__weak id weakObject = strongObject;
然后,如果你仔细阅读你概述的规则,你会问自己以下问题:

  • 斯特朗:“把这个放在堆里,直到我不再指向它为止”

    strong对象
    不再指向
    。所以我们不需要保留它

  • 弱者:“只要有人强烈指出,就保留此项”

    weakObject
    仍然指向
    。但既然没有其他人指向它,这条规则也意味着我们不需要保留它

  • 结果是
    被解除分配,如果您的运行时支持它(Lion和iOS 5以上),则
    weakObject
    将自动设置为
    nil

    现在考虑如果我们将<代码>弱小对象< /代码>设置为<代码> nIL<代码>,如下:

    strongObject = nil;
    
    weakObject = nil;
    
    然后,如果你仔细阅读你概述的规则,你会问自己以下问题:

  • 斯特朗:“把这个放在堆里,直到我不再指向它为止”

    strong对象
    指向
    。所以我们确实需要保留它

  • 弱者:“只要有人强烈指出,就保留此项”

    weakObject
    未指向

  • 结果是,
    未解除分配,但
    weakObject
    将是
    nil
    指针

    [请注意,所有假设都不是由其他地方的另一个强引用/其他“持有”方式指向的。]

    strong

  • 在属性和指定值之间创建所有权
  • 这是ARC中对象属性的默认值,因此它不会让您担心引用计数并自动释放引用
  • 它是对保留的替代。当且仅当我们需要用作保留时,我们才使用
  • 软弱的

  • 在属性和指定值之间创建非所有权
  • 当释放父对象时,强对象用于父对象,弱对象用于子对象,然后子对象引用也设置为nil
  • 它有助于防止循环
  • 垃圾收集器收集时,它不保护引用的对象
  • 弱本质上是赋值的、不可保持的属性
  • 另一个例子:
    学生是一个
    对象
    ,假设她/他可以毕业(
    解除分配
    ),只要她/他完成了所有核心课程(
    强项
    ),不管她/他是否选修了选修课(
    弱项
    )。换句话说:强指针是解除分配
    对象的唯一因素

    我知道我参加这个聚会已经晚了,但我认为重要的是要混淆这个问题,指出“强和弱内存模型”的含义取决于你谈论的是软件还是硬件

    对于硬件,弱或强表示是否支持顺序一致性

    [SC意味着]…任何执行的结果都与所有 处理器以某种顺序执行,而 每个单独处理器的操作按此顺序显示在 由其程序指定的顺序。-

    WTF是否与内存有关?这意味着不同处理器对变量的写入必须以相同的顺序被所有处理器看到。在具有强大型号的硬件中,这是有保证的。在硬件上使用w