NSMutableArray删除对象会增加引用计数吗? [英] NSMutableArray remove object increases reference count?

查看:155
本文介绍了NSMutableArray删除对象会增加引用计数吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些代码导致iOS静态库上的内存泄漏.这是Instruments中对象的生命周期:

I have some code that is causing memory leaks on an iOS static library. Here is an object's lifetime from Instruments:

# 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中删除对象时,似乎会增加保留计数,而不是减少.其他人有这个问题并且知道解决方案吗?

When I remove the object from the NSMutableArray, it seems to increase the retain count instead of decrementing it. Has anyone else had this problem and knows of a solution?

推荐答案

我可以重现您使用Instruments观察到的内容.在丢弃对象之前,NSMutableArray会保留它,进行一些魔术操作然后释放它.此发行版抵消了先前的保留,与以后发生的事情无关:这是一次发行版,因为对象已从数组中删除.

I can reproduce what you are observing with Instruments. Before discarding your object, the NSMutableArray retains it, does some magic and then releases it. This release counteracts the previous retain and has nothing to do with what happens a bit later: again a release, this time because the object is removed from the array.

该数组的内部实现所执行的操作完全不需要您关注.它可以根据需要频繁地保留/释放对象,重要的是它多次调用release而不是保留,因为您希望在删除对象时就可以.因此,您观察到的情况

What the internal implementation of the array is doing should not concern you at all. It could retain/release the object as often as it wants, the important part is that it calls release once more than retain, because you expect that when the object is removed. Thus, what you observe

retain
release
release

很好,根本没有内存泄漏.在removeObject:的内部实现中执行代码时,retainCount可能会增加,但是一旦方法返回,计数实际上就会减少.

is just fine and no memory leak at all. While executing code in the internal implementation of removeObject:, the retainCount might rise, but as soon as the method returns, the count is actually decreased.

这篇关于NSMutableArray删除对象会增加引用计数吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆