A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ⒈心只霸占沵 高级黑马   /  2014-6-16 17:25  /  1330 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ⒈心只霸占沵 于 2014-7-6 20:56 编辑

内存管理遵循有retain就得有release
我想问的是如果我定义了一个对象数组,数组中添加对象时是怎么retain的,内存管理又怎么release数组中的元素的?

6 个回复

倒序浏览
还没太看到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;
}

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

回复 使用道具 举报
没搞懂啊!!!
回复 使用道具 举报
liulinjie 发表于 2014-6-16 18:26
还没太看到NSArray, 我猜测可能和对象的set方法和dealloc方法类似:

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

谢谢,我想肯定有这样的做法,我是想知道底层是怎么实现的,所以问了一下!
回复 使用道具 举报
理解的够深的呀
回复 使用道具 举报
本帖最后由 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.






回复 使用道具 举报
学习一下。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马