Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标c执行任务时的强弱关系_Objective C - Fatal编程技术网

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

Objective c 目标c执行任务时的强弱关系,objective-c,Objective C,我目前正在阅读苹果公司的objective c编程文档。在解释强弱关系的一章中,有一部分说: 默认情况下,局部变量和非属性实例变量还保持对对象的强引用。这意味着以下代码将完全按照您的预期工作: NSDate *originalDate = self.lastModificationDate; self.lastModificationDate = [NSDate date]; NSLog(@"Last modification date changed from %@ to %@",

我目前正在阅读苹果公司的objective 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;
谁提到了谁??
谢谢大家!

那里使用的语言有些微妙之处。请记住,originalDate是代码中显示的变量。而单词originaldate只是一个关于变量引用的起始值的语句

换句话说,不要把提到变量originalDate和单词origindate混为一谈,originalDate指的是变量开始引用的日期值

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

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

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

现在您得到了代码self.lastModificationDate=[NSDate-date];。这有两个作用。首先,它创建一个新的NSDate实例。在我们的类比中,它创造了一个新的球。将此新球标记为第二个NSDate实例。其次,这将更改标记为self.lastModificationDate的人所指向的球。现在想象一下,这个人不再指向原始球,而是指向新球。但请记住,标有originalDate的人仍然指向第一个球,即混乱文本中提到的原始日期

总结。在两行代码之后:

NSDate *originalDate = self.lastModificationDate;
self.lastModificationDate = [NSDate date];
我们有两个球和两个人。每个人都指向不同的球。标记为self.lastModificationDate的人员指向标记为Second NSDate实例的新球,标记为originalDate的人员指向标记为original Date实例的原始球

那代码行呢

NSLog(@"Last modification date changed from %@ to %@",
                originalDate, self.lastModificationDate);
通过显示记录了两个不同的日期来验证这一点。originalDate变量引用的和self.lastModificationDate引用的新变量

同样,把变量想象成人,把物体想象成人指向的球。人们可以指出没有球或只有一个球。多个人可以指向同一个球。你甚至可以在没有人指向球的情况下结束比赛。这称为内存泄漏


以上并没有真正涵盖强弱。因此,我们将对类比进行一点扩展。想象一个有力的参照物是一个人实际抓着一个球。想象一个弱的参照物,一个人只是指着球。只要至少有一个人拿着一个球作为有力的参照物,球就会保持在原位。如果一个球到达了一个点,没有人再拿着它,没有更多的强引用,球就会落下并消失,对象就会被释放。这是真的,即使有人引用它。在这些情况下,那些仅仅指向它的人现在什么也没有指向——弱引用变成了零。

我将您的代码放在一个方法中,并在每个步骤中添加注释。让Date1成为第一个NSDate self.lastModificationDate引用。让Date2作为第二个NSDate self.lastModificationDate引用

-(void)printDates 
{
    // self.lastModificationDate: holds a strong reference to Date1
    // originalDate: does not exist yet

    NSDate *originalDate = self.lastModificationDate;

    // self.lastModificationDate : still holds a strong reference to Date1
    // originalDate: holds a strong reference to Date1

    self.lastModificationDate = [NSDate date];

    // self.lastModificationDate : now holds a strong reference Date2
    // originalDate: still holds a strong reference to Date1

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

    return;

    // The method has returned so originalDate releases its strong reference to Date1

    // self.lastModificationDate : still holds a strong reference to Date2
    // originalDate: does not exist

    // At this point there are no strong references to Date1 so Date1 is released
}