0

我假设根据我正在阅读的“Cocoa 设计模式”书,retain 函数是使用这样的东西实现的:

   - (int)retainCount
// Returns the receiver's current reference count
{
int result = 1; // receiver not in table, its count is 1
void *tableValue = NSMapGet(
[[self class] _myRefCountMapTable], self);
if(NULL != tableValue )
{ // if receiver is in table, its count is the value stored
result = (int)tableValue;
}
return result;
}

- (id)retain
// Increases the receiver's reference count
{
// store the increased value in the table
NSMapInsert([[self class] _myRefCountMapTable], self,
(void *)([self retainCount] + 1));
return self;
}

如示例所示,每个引用对象都具有相同的 self 成员。这是怎么发生的?也许我不明白 self 的含义 - 我虽然它就像 C++ 中的“this”。

如果我只使用赋值运算符(A = B)它是否复制指针(自我),就是这样?我虽然它会使用“copywithzone”,但它的亲戚和“自我”成员不会相等。此外,我认为 copywithzone 就像 c++ 中的复制构造函数。

我想我在两个世界之间感到困惑。

4

2 回答 2

1

我记得听说过你不应该对retainCount 做任何假设。:-)

self 确实与此非常相似。

赋值只是复制指针,在 C++ 中也是如此。

NSObject *objA =[[NSObject alloc] init];
NSObject *objB = objA;

objA 和 objB 引用同一个对象。

并不是说您的代码示例使用 [self class],因此他们会为该类的所有实例为每个类使用一个表。

于 2010-07-06T09:37:51.620 回答
1

正如示例所暗示的每个引用对象......</p>

没有“参考对象”这样的东西。我怀疑这不是你的意思,所以请澄清。

具有相同的自我成员。

对象没有成员(实例有实例变量,在概念上相似但在实现上不一样)。

self不是“成员”,也不是实例变量。请注意,类也有selfself是消息的一个特殊隐藏参数,包含作为消息接收者的对象。

不,self不是一次引用每个对象。如果您将相同的消息发送到两个不同的对象,即使是同一个类,self参数将在每条消息中包含不同的指针。

也许我不明白 self 的含义 - 我虽然它就像 C++ 中的“this”。

据我了解“<code>this”,是的。self是接收消息的对象 - 在您的示例中,某物正在保留或询问保留计数的对象。

如果我只使用赋值运算符(A = B)它是否复制指针(自我),就是这样?

复制的指针只会是selfif Bis self。也就是说,如果你说A = self,那么它会将self指针复制到A。如果你说B = self,然后你说A = B,同样的事情,因为Bself包含相同的指针。如果你没有说B = self,那么B可能是一些其他的值,所以其他的值就是将被复制到的A。这是假设A并且B是指针变量。

它会复制你告诉它复制的值(指针)。没有其他的。

我虽然它会使用“copywithzone”,但它的亲戚和“自我”成员不会相等。

不会。只有当某物向它发送消息时,才会向对象发送copyWithZone:消息(不要省略冒号——它们很重要)copyWithZone:。最常见的方式是向它发送一条copy消息,因为它会copyWithZone:依次发送一条消息。

此外,即使是“副本”也不总是复制对象。不可变对象可以实现copyWithZone:返回[self retain]

但是,普通赋值永远不会复制对象。它只复制指针。

此外,我认为 copywithzone 就像 c++ 中的复制构造函数。

大致。我不知道足够多的 C++ 来说明它有多像。

于 2010-07-06T16:52:01.167 回答