Explanation of strong and weak storage in iOS5

I am new to iOS5 development and using objective-c. I have trouble understanding the difference between strong and weak storage. I have read the documentation and other SO questions, but they all sound identical to me with no further insight.

I read the documentation: Transitioning To ARC - it references to iOS4 terms of retain, assign, and release; which confuses me. Then I look into Open U CS193p, where it differentiates strong and weak:

Strong: "keep this in the heap until I don't point to it anymore"
Weak: "keep this as long as someone else points to it strongly"

Aren't the two definition identical = if pointer no longer pointing to an object, then free the memory holding the object? I understand the concept of pointers, heap, allocation or deallocation of memory - but what's the difference between strong and weak?

51545 次浏览

不,他们不是一样的,但是非常不同。只有在需要保留对象时才使用 strong。在任何其他情况下都可以使用弱,它的优点是可以知道对象是否已经从堆中移除,因为没有人保留它。

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

也许应该举个例子。

假设我们的对象是一只狗,而这只狗想要逃跑(被释放)。

强有力的指点就像狗身上的皮带。只要你把皮带拴在狗身上,狗就不会跑掉。如果五个人把他们的皮带系在一只狗身上(五个强力的指针指向一个物体) ,那么这只狗将不会逃跑,直到所有的五个皮带都被解开。

另一方面,弱点就像小孩子指着狗说: “看!一只狗!”只要狗还拴在狗链上,小孩子们还是能看到狗,他们还是会指着它。不过,一旦所有的皮带都解开,不管有多少小孩指着它,狗都会跑开。

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

这两个定义不是一样的吗。

绝对不行。你所指出的两个定义的关键区别在于“和别人一样长”。“别人”才是最重要的。

考虑以下几点:

__strong id strongObject = <some_object>;
__weak id weakObject = strongObject;

现在我们有两个指针指向 <some_object>,一个强,一个弱。如果我们像这样将 strongObject设置为 nil:

strongObject = nil;

然后,如果你通过你概述的规则,然后你会问自己这些问题:

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

    strongObject doesn't point to <some_object> any more. So we don't need to keep it.

  2. 弱点: “只要有人强烈指出,就要保持这种状态”

    weakObject仍指向 <some_object>。但是因为没有 别的指向它,这个规则也意味着我们不需要保留它。

结果是解除 <some_object>的分配,如果您的运行时支持它(Lion 和 iOS5以上) ,那么 weakObject将自动设置为 nil

Now consider what happens if we set weakObject to nil like so:

weakObject = nil;

然后,如果你通过你概述的规则,然后你会问自己这些问题:

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

    strongObject的确指向 <some_object>,所以我们需要保留它。

  2. 弱点: “只要有人强烈指出,就要保持这种状态”

    weakObject不指向 <some_object>

结果是 <some_object>没有释放,但是 weakObject将是 nil指针。

[注意,所有这一切都是假设 <some_object>没有被其他地方的另一个强引用/被“持有”的一些其他方式所指向]

很强壮

  1. 在属性和已分配价值之间创建所有权。
  2. 这是 ARC 中对象属性的默认值,因此它不会让您担心引用计数并自动释放引用。
  3. 它是保留的替代品。我们使用当且仅当我们需要作为保留使用。

软弱

  1. 在财产和分配的价值之间创建非所有权。
  2. 当父对象被释放时,在子对象上使用 Strong,然后子对象引用也被设置为 nil
  3. 它有助于防止保留周期。
  4. 当垃圾收集器进行收集时,它不保护被引用的对象。
  5. 弱属性本质上是分配的、不保留的属性。

Another example: 学生是一个 Object,假设她/他可以毕业(deallocate) ,只要她/他完成所有的核心课程(strong pointers) ,无论她/他选修课程(weak pointers)。换句话说: 强指针是 Object释放的唯一因素。

I know I'm rather late to this party, but I think it's important to confuse the issue by pointing out that the meaning of "strong and weak memory models" depends on whether you are talking about software or hardware.

For hardware, weak or strong indicates whether there is support for sequential consistency.

[ SC 的意思是] ... 任何执行的结果都与所有操作的结果相同 处理器以某种顺序执行,而 每个处理器的操作都按照这个顺序出现在 order specified by its program. - Lamport, 1979

卧槽和记忆力有关吗?这意味着不同处理器对变量的写操作必须被所有处理器以相同的顺序看到。在硬件与一个强大的模型,这是保证。在模型较弱的硬件上,它不是。

Existing answers interpret the question only in terms of software memory models. Hardware is not irrelevant to programming. This very question mentions iOS, which typically runs on Arm7 processors. Arm7 has a weak memory model. For programmers accustomed to processors with a strong model - which is all of us because x86 and x64 have a strong model - this is a terrible trap. Using a bool to signal another thread to exit works fine in a strong model. The same code on Arm doesn't work at all unless you mark the flag volatile, and even then it's erratic.

尽管 Arm8 + 确实通过明确支持获取/发布完全改变了这一点,但遗留软件并不使用这种支持。遗留软件包括所有三个电话操作系统和一切运行在他们,以及编译器和库,直到他们更新。

对于这个主题的扩展检查,我建议您参考独特的 Herb Sutter