将一个指向对象的指针设置为nil是否会影响该对象或其他指向该对象的指针



虽然我知道深度复制和浅层复制之间的主要区别,但我想问的是一些实用的问题。

我有

NSArray *firstArray = [NSArray arrayWithObjects:@"first", @"second",@"third",  nil];
NSArray *secondArray    = firstArray;
secondArray             = nil;
NSLog(@"First Array : %@",firstArray);
NSLog(@"Secon Array : %@",secondArray);

CCD_ 1和CCD_。

现在我的问题是,如果两者都有相同的REFERENCE,那么如果secondArray发生变化,为什么firstArray不会发生变化。

我真的很困惑。。。谁能让我说清楚吗。

期待中的感谢。

我需要使用ASCII艺术来更好地解释这一点。。。

firstArray


NSArray - the actual data
/
/
secondArray

firstArraysecondArray只是指针,保持存储NSArray数据的相同数字(虚拟)存储器地址。如果其中一个指针被设置为指向nil,或者指向其他数据,则不会触发NSArray或其他指针的任何更改。

特别要注意的是,虽然firstArray0和secondArray最初都保持相同的值,但它们在不同的存储器地址处是不同的变量。你可以看到,如果你打印:

NSLog(@"First Array : %@",&firstArray);
NSLog(@"Secon Array : %@",&secondArray);

我认为你把它们指向的地址(NSArray数据的地址)误认为是它们的地址,然后得出结论,它们是同一变量的不同名称。他们不是!每个都有不同的记忆。

你可能想读一下指针:;取消引用";指针意味着什么?

指针和引用

指针变量很像整数变量——它占用几个字节的内存(不管它可能指向的对象的大小),并存储一个数字。该数字可用于记录(虚拟)存储器地址(从(虚拟)内存的0原点起有多少字节),在该地址可以找到指向类型的特定对象。所以,这有点像有一张纸,我们可以在上面写下房子的地址。现在,指针不是房子(数据对象),你可以随时删除原始地址并写入其他房子的地址,你可以使用该地址找到房子。这就是这个问题中发生的事情。。。你实际上有两张"纸",上面"写"了你"房子"的地址,然后抹去了其中一张,并预期会产生戏剧性的影响,比如另一张纸被抹去和/或房子/物体被摧毁。指针不是那样工作的。

有些语言有一种独特的机制,在各种语言的术语中被称为"引用"、"别名"、"链接"和许多其他东西,其作用就像对象的附加名称或别名。你对其中一件事"做"的任何事情都会透明地对该对象进行。回到我们的房子类比:这就像你的房子有不同的名字——你可以称之为"家"或"我的城堡",而不是使用街道地址,如果你给出"烧家"的指示,你的房子就会被烧毁。用指针指向你的家——说"烧指针指向家"只会烧掉这张纸,除非你付出一点额外的努力来"取消引用"指针并对房子进行操作。

当它们需要在运行时在程序中传递时,它们引用/别名/事物。。。通常像指针一样实现——实际上是存储数据对象地址的变量。但是,不管它们是在运行时传递的,还是只是暂时存在于编译器的内部记录中,它们都会按照上面描述的方式运行。

因此,对于那些来自"引用"是用来描述这些引用/别名/任何事物的技术术语的背景的人来说,听到人们说指针是引用是"错误的"。。。我们的反应是"不,他们不是——如果你这样想的话,你会烧掉纸而不是房子"。但是,对于整个程序员社区来说,"引用"是"指针"的另一个术语,而这些其他东西可能被称为"别名"、"链接"、"假名"或天知道吗,或者它们可能不存在于该语言/社区中(例如C程序员)。

我们在评论中的所有讨论都只是关于这种潜在的困惑。

重要的是,你要明白,对指针的操作会影响指针存储的内存中的数字地址,而不是指向对象,除非你取消引用该指针,而不是该对象的其他指针(除非它们都是经过精心编排的同步的"智能指针")。

我建议你读上面的内容,直到你再也读不出来为止,然后重读《什么是》;取消引用";指针意味着什么?然后再读一遍,直到你很高兴你已经掌握了所有内容。

您当前的理解

在下面的评论中,你说:

据我所知,指针是一个可以包含内存地址的变量,内存地址总是作为对值的引用。

指针中的内存地址可以引用/指向合法的对象/值,也可以是未初始化或垃圾,就像整数变量中可能有有用的数字或未初始化(尚未设置),或者在早期处理后保留一些您不再感兴趣的剩余值一样。

让我在这里澄清我的观点,指针有一个内存地址,在这个内存地址上会有一些值。

这是模棱两可的,但无论你怎么说都是正确的。歧义:指针有一个内存地址,就像指针本身存储的内存一样。从这个意义上说,每个变量都有一个内存地址。但是,指针也具有指向数据的存储器地址意义上的存储器地址。(这在我上面链接的另一个答案中有解释。)

因此,如果某个人必须获得该值,则必须有一个引用才能到达该值,并且该引用是包含它的点的属性。

好吧,我认为你所说的值指的是指向值:你必须有一个"内存地址"才能到达那里(是否要将该地址称为引用在上面讨论过),并且该地址存储在指针中,所以如果你使用某些语言所使用的"属性",你可以将其视为指针的一个"属性"。是的!:-)我认为你的理解可能是正确的,但你的术语仍然有点不精确和模棱两可。

最新更新