代码之家  ›  专栏  ›  技术社区  ›  Idan

可可中的参考计数

  •  0
  • Idan  · 技术社区  · 15 年前

    根据我正在阅读的《可可设计模式》一书,我假设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”成员是不平等的。 此外,我认为CopyUnZead就像C++中的复制构造函数。

    我想我把这两个世界搞混了。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Peter Hosey    15 年前

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

    没有__reference object__这样的东西。我想这不是你的意思,所以请澄清。

    具有相同的自身成员。

    对象没有成员(实例具有实例变量,这些变量在概念上相似,但在实现中不同)。

    self 不是__member_,也不是实例变量。请注意,类有 自己 也。 自己 是消息的特殊隐藏参数,包含作为消息接收者的对象。

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

    也许我不理解自我的意思——尽管它在C++中就像“这个”。

    据我所知 this 是的,是的。 自己 是在您的示例中收到消息“保留”的对象,是某个对象保留或请求保留计数的对象。

    如果我只使用赋值操作符(a=b),它会复制指针(self)吗?

    复制的指针将仅 自己 如果 B 自己 . 也就是说,如果你说 A = self ,然后它将复制 自己 指针指向 A . 如果你说 B = self 然后你说 A = B ,同样的事情,因为 自己 包含相同的指针。如果你没有说 B=自我 然后 可能是其他值,因此其他值将被复制到 . 这是假设 是指针变量。

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

    我认为它会使用“copywithzone”,它的亲戚和“self”成员是不平等的。

    不,对象只发送一个 copyWithZone: 消息(不要省略冒号,它们很重要)当某个东西发送它时 复制区: 消息。最常见的方法是发送一个 copy 消息,因为它将发送 复制区: 依次传递消息。

    此外,即使是__copy_也不总是复制对象。不可变对象可以实现 复制区: 归来 [self retain] 相反。

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

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

    粗略地说。我不知道足够的C++来说明它有多像它。

        2
  •  1
  •   Eiko    15 年前

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

    自我确实与此非常相似。

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

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

    obja和objb参考 相同的 对象。

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

    推荐文章