setter是否也“重置”了相关对象?

时间:2012-06-16 16:58:09

标签: objective-c setter objective-c-runtime associated-object

虽然进入一个很长的argument超过内存位置vs指针vs相关对象,但我们偶然发现了一些令人头痛的问题:虽然setter可能会设置传递对象的内存地址相等,但是说传递对象,反过来又有相同的关联对象?

从理论上讲,它是有意义的,因为任何共享相同内存地址的对象必须具有相同的关联对象,因为它们相同的对象,对吗?

2 个答案:

答案 0 :(得分:4)

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

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

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

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


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

答案 1 :(得分:3)

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

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