黑马程序员技术交流社区

标题: 对象数组的内存是怎么管理的? [打印本页]

作者: ⒈心只霸占沵    时间: 2014-6-16 17:25
标题: 对象数组的内存是怎么管理的?
本帖最后由 ⒈心只霸占沵 于 2014-7-6 20:56 编辑

内存管理遵循有retain就得有release
我想问的是如果我定义了一个对象数组,数组中添加对象时是怎么retain的,内存管理又怎么release数组中的元素的?
作者: liulinjie    时间: 2014-6-16 18:26
还没太看到NSArray, 我猜测可能和对象的set方法和dealloc方法类似:

1. 当设置数组元素时, 把原来的元素release一次, 再把新元素retain一次.
比如, 有一个对象指针数组 array, 想把它的第一个元素设置为一个Student对象stu:
if (array[0] != stu) {
        [array[0] release];           // 把原来的对象release一次
        array[0] = [stu retain];    // 把新的对象retain一次
}

2. 如果不再使用这个数组了 (比如在main函数结束前), 对所有的数组元素release一次.
for (id obj in array) {
        [obj release];        // 把每个元素release一次
        // obj = nil;
}

作者: ██    时间: 2014-6-16 20:39
没搞懂啊!!!
作者: ⒈心只霸占沵    时间: 2014-6-17 09:04
liulinjie 发表于 2014-6-16 18:26
还没太看到NSArray, 我猜测可能和对象的set方法和dealloc方法类似:

1. 当设置数组元素时, 把原来的元素re ...

谢谢,我想肯定有这样的做法,我是想知道底层是怎么实现的,所以问了一下!
作者: siegee    时间: 2014-6-17 10:19
理解的够深的呀
作者: Medwyn    时间: 2014-7-6 13:45
本帖最后由 Medwyn 于 2014-7-6 15:06 编辑

1.如何retain?
数组对于每一个新添加进来的元素进行一次retain
例如对一个数组array:
  1.     //首先创建一个Dog类,这里就不贴出来了,接着用Dog类创建一个dog对象
  2.     Dog *dog = [[Dog alloc] init];
  3.     //这里使用可变数组存储对象
  4.     NSMutableArray *array = [[NSMutableArray alloc] init];
  5.    
  6.     //往array里新添加一个dog对象,此时数组会自动为dog的计数+1   你可以通过重写Dog类的dealloc方法,打印输出来验证,这里就不赘述了
  7.     [array addObject:dog];
复制代码


2.如何release?
还是直接上代码,简单直观:
  1.     //1.数组销毁的时候(假设之前的数组自身计数为1,这时间release自然销毁了),会将数组的每一个元素release
  2.     [array release];
  3.     //2.将所有元素移除时,会将数组中每一个元素release
  4.     [array removeAllObjects];
  5.     //3.移除指定的对象,那么此对象会release
  6.     [array removeObjectAtIndex:0];//这里以移除下标为0的元素对象为例(其实就是那条dog,萌萌哒),数组array会对dog对象release一次
复制代码
验证方法同1.







作者: hm123tinghai    时间: 2014-7-6 14:24
学习一下。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2