黑马程序员技术交流社区
标题:
对象数组的内存是怎么管理的?
[打印本页]
作者:
⒈心只霸占沵
时间:
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:
//首先创建一个Dog类,这里就不贴出来了,接着用Dog类创建一个dog对象
Dog *dog = [[Dog alloc] init];
//这里使用可变数组存储对象
NSMutableArray *array = [[NSMutableArray alloc] init];
//往array里新添加一个dog对象,此时数组会自动为dog的计数+1 你可以通过重写Dog类的dealloc方法,打印输出来验证,这里就不赘述了
[array addObject:dog];
复制代码
2.如何release?
还是直接上代码,简单直观:
//1.数组销毁的时候(假设之前的数组自身计数为1,这时间release自然销毁了),会将数组的每一个元素release
[array release];
//2.将所有元素移除时,会将数组中每一个元素release
[array removeAllObjects];
//3.移除指定的对象,那么此对象会release
[array removeObjectAtIndex:0];//这里以移除下标为0的元素对象为例(其实就是那条dog,萌萌哒),数组array会对dog对象release一次
复制代码
验证方法同1.
作者:
hm123tinghai
时间:
2014-7-6 14:24
学习一下。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2