Objective c 可可中的参考计数

Objective c 可可中的参考计数,objective-c,cocoa,pointers,reference-counting,Objective C,Cocoa,Pointers,Reference Counting,根据我正在阅读的《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

根据我正在阅读的《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;
}
正如示例所示,每个引用对象都有相同的自成员。 这是怎么发生的?也许我不理解自我的意思——尽管它在C++中就像“这个”。 如果我只使用赋值运算符(A=B),它会复制指针(self)吗? 我想它会使用“copywithzone”,它的亲属和“self”成员将不平等。 此外,我认为CopyWORZZE就像C++中的复制构造器。
我想我把这两个世界搞混了。

我记得听说你不应该对重新计算做任何假设。:-)

赛尔夫确实与此非常相似

赋值只复制指针,C++中也是一样。

NSObject *objA =[[NSObject alloc] init];
NSObject *objB = objA;
objA和objB引用同一对象

并不是说您的代码示例使用了[self class],所以对于该类的所有实例,每个类使用一个表

正如示例所示,每个引用对象

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

有相同的自我成员

对象没有成员(实例有实例变量,它们在概念上相似,但在实现上不同)

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

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

也许我不理解自我的意思——尽管它在C++中就像“这个”。 据我所知,“
这个
”,是的
self
是示例中接收消息的对象,是某个对象正在保留或请求保留计数的对象

如果我只使用赋值运算符(A=B),它会复制指针(self)吗

仅当
B
self
时,复制的指针才会是
self
。也就是说,如果您说
A=self
,那么它将把
self
指针复制到
A
。如果你说
B=self
,然后你说
A=B
,同样的事情,因为
B
self
包含相同的指针。如果您没有说
B=self
,那么
B
可能是其他值,因此其他值将被复制到
A
。假设
A
B
是指针变量

它将复制您告诉它要复制的值(指针)。没有别的了

我想它会使用“copywithzone”,它的亲属和“self”成员将不平等

否。当某个对象发送
copyWithZone:
消息时,该对象仅发送
copyWithZone:
消息(不要忽略冒号,因为冒号很重要)。最常见的方法是向其发送
copy
消息,因为这将依次发送
copyWithZone:
消息

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

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

另外,我在C++中使用CopyWORZZE类似拷贝构造函数。


大概吧。我不知道足够的C++来说明它是多么的喜欢。

就像你上面提到的场景,调用[Obj-F留空]和调用[Obj-Real]将包含不同的“自我”参数,正如你所说的,这将使我的“保留”函数的例子不正确。那么谁错了?我的理解?因为我很确定这个例子是正确的。我的意思是,像“SObject*objB=objA;”这样的赋值将使两个对象的retain函数在被调用(或任何其他函数)时具有相同的“self”。是的,您的理解是这样的。请参阅Eiko答案的最后一段,了解
retain
实现中发生的情况。分配
objB=objA
时,没有“两个对象”;有一个对象,其指针位于两个变量中。在这种情况下,
[objA retain]
[objB retain]
都会将
retain
消息发送到同一个对象,这意味着它们都会运行相同的
retain
实现,并且该实现两次都会收到相同的
self
值。很好,这正是我所想的,正如你从我上面的最后一行评论中所看到的。非常感谢!