NSMutableArray - 我可以这样做吗?

时间:2011-11-28 01:00:34

标签: objective-c nsmutablearray

在我的应用程序中,单例类(SharedData)为NSMutableArray分配内存:

[self sharedMutableArray] = [[NSMutableArray alloc] init];

A类填充此sharedMutableArray:

NSObject *obj = [NSObject alloc] init];
[sharedMutableArray  addObject];
obj = nil;

B组这样做 - 这就是我的问题:

NSMutableArray *tmpArray = sharedMutableArray;
       ... uses the tmpArray locally
[tmpArray removeAllObjects];
tmpArray = nil;

这是一个继承的代码,我的预感是这是一个NO-NO。有人可以确认为tmpArray分配nil也会为sharedMutableArray释放内存....我想作者只想释放tmpArray ......

2 个答案:

答案 0 :(得分:1)

nil分配给tmpArray只会将指向对象的指针设置为nil。它根本不会影响对象本身(或其生命周期)。在这种情况下,将您创建的对象设置为nil不会执行任何操作,因为它们的变量声明位于本地范围内 - 如果您希望从内存中取消分配对象,则需要先将它们发送到release指针设置为对象nil

但是,发送removeAllObjects 影响原始的sharedArray,因为您没有复制数组,只需设置一个新指针指向'singleton'。你可能想要这个:

NSMutableArray *tmpArray = [NSMutableArray arrayWithArray:sharedMutableArray];

在上述情况下,您不需要使用removeAllObjects,因为它将自动释放。我建议你阅读this

答案 1 :(得分:0)

tmpArray是一个指针,它被初始化为指向sharedMutableArray指向的同一个可变数组。出于这个原因,行:

[tmpArray removeAllObjects];

将清空数组,使用sharedMutableArray的任何人都会看到此更改。换句话说,分配

NSMutableArray *tmpArray = sharedMutableArray;

不会复制数组本身,它只会复制指针。使用该指针发送的任何消息都将转到共享阵列。同样,将nil分配给tmpArray设置指针tmpArray,但不对数组本身做任何事情。

最后,将变量设置为nil永远不会释放内存。另一方面,将属性设置为nil将在某些条件下释放内存(例如,当声明属性保留其内容时)。你在这里设置一个变量,而不是一个属性,所以阵列不可能被释放。