代码之家  ›  专栏  ›  技术社区  ›  Richard J. Ross III

NSMutableArray remove object增加引用计数?

  •  2
  • Richard J. Ross III  · 技术社区  · 14 年前

    我有一些代码导致了iOS静态库上的内存泄漏。以下是一个物体在仪器中的寿命:

    # Category Event Type Timestamp RefCt Address Size Responsible    Library Responsible Caller
    0 Table_ColumnListener Malloc 4712087040 1 0x5e5fe60 16 Tests -[Table _initWithRows:andColumns:andTupleType:]
    1 Table_ColumnListener Retain 4712301056 2 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
    2 Table_ColumnListener Retain 4712453120 3 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
    3 Table_ColumnListener Retain 4712602112 4 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
    4 Table_ColumnListener Retain 4712755968 5 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
    5 Table_ColumnListener Retain 4712915968 6 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
    6 Table_ColumnListener Retain 4713062144 7 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
    7 Table_ColumnListener Retain 4729644288 8 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
          /\
     This is what confuses me
    8 Table_ColumnListener Release 4729646080 7 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
    9 Table_ColumnListener Release 4729647872 6 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
    10 Table_ColumnListener Retain 4729679104 7 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
    11 Table_ColumnListener Release 4729680896 6 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
    12 Table_ColumnListener Release 4729682944 5 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
    13 Table_ColumnListener Retain 4729713152 6 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
    14 Table_ColumnListener Release 4729714944 5 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
    15 Table_ColumnListener Release 4729717248 4 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
    16 Table_ColumnListener Release 4729731840 3 0x5e5fe60 0 Tests -[Table dealloc]
    

    这是密码 [AbstractColumn addColumnListener:]

    -(void) addColumnListener:(id <ColumnListener>)listener
    {
     [m_listeners addObject:listener];
    }
    

    为了 [AbstractColumn removeColumnListener:]

    -(void) removeColumnListener:(id <ColumnListener>)listener
    {
     [m_listeners removeObject:listener];
    }
    

    NSMutableArray ,看起来 增加 自减 它。有没有其他人有这个问题,知道解决办法?

    1 回复  |  直到 14 年前
        1
  •  2
  •   w-m    14 年前

    我可以用仪器重现你所观察到的。在放弃对象之前,NSMutableArray会保留它,做一些魔术,然后释放它。这个版本抵消了之前的保留,与稍后发生的事情无关:再次是一个版本,这次是因为对象从数组中移除了。

    数组的内部实现所做的事情根本不应该与您有关。它可以随时保留/释放对象,重要的一点是它比retain调用一次release,因为当对象被删除时,您希望这样做。因此,你所观察到的

    retain
    release
    release
    

    推荐文章