2011-11-28 126 views
0

在我的应用程序中,单例类(SharedData)的NSMutableArray的分配内存:NSMutableArrays - 我可以这样做吗?

[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; 

这是一种遗传代码和我的预感是,这是一个没有没有。有人可以证实,将nil分配给tmpArray也会释放sharedMutableArray的内存......我猜想作者只想释放tmpArray ...

+2

正如其他人说,设置一个指向零只设置指针为零。指针不是它指向的对象,不仅仅是你在明信片上的地址就是你的房子。销毁明信片不会破坏房子。 –

回答

1

将tmpArray指定为nil仅将您的指针设置为nil。它不会影响对象本身(或其生命周期)。在这种情况下,你所创建的对象设置为nil什么都不做,因为他们的变量声明是在局部范围内 - 如果你想从内存中释放的对象,你需要的指针设置到对象之前,release送他们到nil

然而,发送​​影响你原来的sharedArray,因为你没有数组复制,你只需设置一个新的指针指向了“单身”。你可能希望这样的:

NSMutableArray *tmpArray = [NSMutableArray arrayWithArray:sharedMutableArray]; 

你并不需要在上述情况下使用​​,因为它会被autorelease'd。我建议你阅读this

+0

感谢您的回复。我使用ARC,而我不知道我怎么会去有关复制sharedMutableArray的内容tmpArray - 我应该使用(...)循环? - 像 - for(NSObject * elem in sharedMutableArray){[tmpArray addObject:elem]; } ?? – Sam

+1

ARC使用'arrayWithArray:'没有问题 - 它为你完成所有的复制。但是,您似乎完全不了解所有权的概念 - 数组只是指向其他对象的指针列表。即使您将指针列表复制到新的指针列表中,这些指针指向的对象也不会改变(即它们不会被复制)。 –

+0

设计是从sharedArray填充localArray,使用它,然后放弃 - 如果 - 离开shareData。其他一些操作将管理sharedData。 – Sam

0

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

[tmpArray removeAllObjects]; 

会空出数组,并使用sharedMutableArray人会看到的变化。换句话说,分配

NSMutableArray *tmpArray = sharedMutableArray; 

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

最后,设置一个变量nil从不释放内存。一个属性设置为零,而另一方面,将释放一些条件下(例如,当属性被声明为保持其内容)下存储器。你在这里设置一个变量,而不是一个属性,所以数组将不会被释放。

+0

谢谢 - 良好的外展。如果tmpArray是一个iVar并且有属性,那么tmpArray = nil会释放sharedMutableArray的内存吗? – Sam

+0

“最后,设置一个变量为零*从不*释放内存”< - sans ARC当然(我知道这就是你的意思) –

+0

不,但是'self.tmpArray'会在属性为'retain'的情况下。 –