0

在就内存位置、指针和关联对象进行了一个很好的长争论时,我们偶然发现了一些令人头疼的问题:虽然 setter 可以将传递的对象的内存地址设置为彼此相等,但所说的传递对象是否反过来具有相同的关联对象?

从理论上讲,这是有道理的,因为任何共享相同内存地址的对象都必须具有相同的关联对象,因为它们同一个对象,对吧?

4

2 回答 2

4

您不能有两个 Objective-C 对象(或原语、结构或任何其他数据结构)占用相同的内存地址。* 如果您有两个对象,它们位于同一位置在内存中,那么你实际上只有一个对象。

我们使用指针来访问对象。如果将一个指针设置为另一个,使用简单的赋值:

NSString * s = [NSString stringWithContentsOfFile:@"README"];
NSString * t = s;

那么你有两个指向一个对象的指针。没有对象的复制。如果您通过一个指针更改对象的 ivars 之一,那么当您通过另一个指针查看对象时,您会看到更改后的值。


*完全迂腐:当然,您可以重新解释特定位置的数据(请参阅“梅尔的故事”),但这是超出本问题范围的黑魔法。

于 2012-06-16T18:37:02.130 回答
3

当你说你传递一个对象时,你传递的是一个指针,而不是一个对象。而设置的是内存地址。

当一个带有指向关联对象的内存地址的新指针被传递给 setter 方法,并且内部的对象被设置为新地址时,现在两个指针(传递的指针和设置的指针)具有相同的内存地址,并且它们共享相同的关联对象。

于 2012-06-16T17:07:34.813 回答