改变实例NSArray

时间:2012-10-18 16:51:41

标签: objective-c ios

我有一个实例数组,我最终会根据用户设置进行更改。我将其设置为不可变的NSArray:

@property (strong, nonatomic) NSArray *pointArray;

当我需要更改数组时,我一直这样做:

-(void)changePointArray
{
    NSMutableArray *tempArray = [NSMutableArray arrayWithArray:self.pointArray];

    // Make changes

    self.pointArray = [NSArray arrayWithArray:tempArray];
}

这是可接受的做法还是我在创造泄漏?我应该改为对它进行类型转换:

self.pointArray = (NSArray *)tempArray;

或甚至需要担心将NSMutableArray设置为NSArray?

self.pointArray = tempArray;

4 个答案:

答案 0 :(得分:2)

你有什么顾虑?对于这样的场景,人们可能会关注原子性,对其他人修改阵列的安全性,两者都没有。如果您不关心它们,只需将您的属性设置为NSMutableArray并在适当的位置进行修改。

如果你担心原子性,你应该制作副本,修改副本,然后交换它(但是,当然,对象的所有用户必须知道自己制作指针用于一系列"原子"引用,而不是重新引用每个引用的属性。)

为了安全起见,你应该使数组成为不可变的NSArray并使属性成为只读。

答案 1 :(得分:1)

您不必担心此self.pointArray = tempArray;,因为NSMutableArrayNSArray的子类。也许为NSMutableArray分配了更多的内存,但这根本不是问题 - 不用担心。

当然你还可以做self.pointArray = [NSArray arrayWithArray:tempArray];

如果你有

,你会遇到相反的问题

@property (strong, nonatomic) NSMutableArray *pointArray;

你正在尝试self.pointArray = tempArray; tempArray是NSArray*

如果你试图self.pointArray = (NSMutableArray*)tempArray;在这种情况下你会遇到问题

答案 2 :(得分:1)

不,没有泄漏(关于内存管理)。

如果您的目标是不在公共接口中公开相互数组,那么您的代码绝对可以。

但是,如果您不关心抽象(或者该属性不公开),那么首先声明类型为NSMutualArray *的属性会更容易。

答案 3 :(得分:0)

如果可以更改或修改内容,那么最佳解决方案是使用NSMutableArray代替NSArray

如果您有任何特定原因使用NSArray,则以下代码是最佳解决方案。

self.pointArray = [NSArray arrayWithArray:tempArray];