目标c执行任务时的强大和弱关系

时间:2015-09-19 16:19:43

标签: objective-c

我目前正在阅读客观c编程的苹果文档。在一章解释强&弱关系,有一部分说:

默认情况下,局部变量(和非属性实例变量)也保持对对象的强引用。这意味着以下代码将完全按预期工作:

NSDate *originalDate = self.lastModificationDate;
self.lastModificationDate = [NSDate date];
NSLog(@"Last modification date changed from %@ to %@",
                    originalDate, self.lastModificationDate);

在此示例中,局部变量originalDate维护对初始lastModificationDate对象的强引用。更改lastModificationDate属性后,该属性不再保留对原始日期的强引用,但该日期仍由originalDate强变量保持活动状态。

我很困惑: originalDate保持对lastModificationDate的强引用,并且它表示lastModificationDate也保留了对原始日期的强引用,这意味着它们之间保持着强烈的关系(强循环?)

这种理解是否正确? 我的问题是,当你有这样的作业时,你能给出一个关于两个对象之间关系的图表:

NSDate *originalDate = self.lastModificationDate;

谁有谁参考? 谢谢!

1 个答案:

答案 0 :(得分:0)

在那里使用的语言有些微妙。请记住,originalDate是代码中显示的变量。并且"原始日期"只是关于变量引用的原始(起始)值的声明。

换句话说,不要将变量originalDate的提及与单词"原始日期"混淆。它指的是变量在开头引用的任何日期值。

为了帮助澄清,您需要了解对象(例如NSDate的实例)驻留在内存中。把它想象成一个可以站在前面的球。并且这个球标有"原始NSDate实例"。

现在让一个人站在这个球的前面并指向球。标记此人" self.lastModificationDate"。在代码中,这将类似于self.lastModification = [NSDate date];

现在您遇到了代码行NSDate *originalDate = self.lastModificationDate;。在我们的比喻中,这意味着我们添加了第二个人,并且我们标记了这个人" originalDate"。代码行说originalDate现在指向self.lastModificationDate指向的同一对象。所以我们的第二个人也指向同一个球。所以现在有两个人指向同一个标有"原始NSDate实例的球#34;。

现在您获得代码行self.lastModificationDate = [NSDate date];。这样做有两件事。首先,它创建一个新的NSDate实例。它在我们的比喻中创造了一个新球。标记这个新球"第二个NSDate实例"。其次,这会改变被标记为" self.lastModificationDate"指着。所以现在想象那个人停止指向原始球并且现在指向新球。但请记住,标记为" originalDate"仍然指向第一个球("原始日期"在令人困惑的文字中提到)。

概要。在两行代码之后:

NSDate *originalDate = self.lastModificationDate;
self.lastModificationDate = [NSDate date];
我们有两个球和两个人。每个人都指向一个不同的球。被标记为" self.lastModificationDate"指向新球标记为"第二个NSDate实例"以及标有" originalDate"指向标有"原始日期实例"。

的原始球

代码行

NSLog(@"Last modification date changed from %@ to %@",
                originalDate, self.lastModificationDate);

通过向您显示记录两个不同的日期来验证这一点。 originalDate变量引用的变量和self.lastModificationDate引用的新变量。

再次,将变量视为人,并将对象视为人们所指向的球。人们可以指出无球或一球。多人可以指向同一个球。你甚至可以得到一个球没有人指向它的情况。这被称为"内存泄漏"。

上述内容并未真正涵盖"强大"并且"弱'。所以我们将稍微扩展一下这个类比。想象一下,作为一个真正抓住球的人的强烈参考。想象一个简单指向球的人的弱引用。只要至少有一个人握住球(强力参考),球就会保持原位。如果一个球到达没有人再拿着它的位置(没有更强的参考),球会下降并消失(对象被解除分配)。即使有人(弱引用)指向它也是如此。在这些情况下,仅仅指向它的人现在指向什么(弱引用变为nil)。