2012-10-18 25 views
0

我有一个实例数组,我将最终根据用户设置进行更改。我设置了一个不可改变的NSArray:改变一个实例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; 
+0

你有没有试过[self.pointArray mutableCopy]? – CBredlow

+1

因为'arrayWithArray'返回一个自动释放对象,所以你没有泄漏 – MrBr

回答

1

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

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

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

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;在这种情况下您会遇到问题

0

如果内容可以更改或修改,那么最好的解决方案是使用NSMutableArray而不是NSArray

如果您有任何使用NSArray的具体原因,那么下面的代码是最好的解决方案。

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

您有什么担忧?对于这种情况,人们可能会关心原子性,针对其他人修改阵列的安全性,或者两者兼而有之。如果您不关心,只需将您的属性设置为NSMutableArray并将其修改即可。

如果你担心原子,你应该做一个拷贝,修改副本,然后将其交换(但是,当然,对象的所有用户都必须知道,使指针自己的私有副本对于一系列“原子”引用,vs对每个引用重新引用属性)。

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

+0

是的,我不确定是否使用实例可变数组是一个禁忌或不是,所以我做了一个快速的谷歌搜索。发现一些人因为这些原因而建议在不变的情况下作出推荐。没有考虑将其设置为只读。 TBH,我不需要担心这个程序的原子性,但我认为这将是一个好习惯。 – Padin215

+0

@ Log139 - 当然,对于99%的应用来说,“安全性”并不重要,因为一小部分人可以访问所有来源并可以更改任何内容。无论如何,Objective-C并不是真正的“安全”。 “安全”确实只能防止意外修改,“哎呀,我真的应该这样做'正确'的方式,但我没有时间修改。 –