我目前正在阅读客观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;
谁有谁参考? 谢谢!
答案 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
)。