我有一个实例数组,我最终会根据用户设置进行更改。我将其设置为不可变的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 :(得分:2)
你有什么顾虑?对于这样的场景,人们可能会关注原子性,对其他人修改阵列的安全性,两者都没有。如果您不关心它们,只需将您的属性设置为NSMutableArray并在适当的位置进行修改。
如果你担心原子性,你应该制作副本,修改副本,然后交换它(但是,当然,对象的所有用户必须知道自己制作指针用于一系列"原子"引用,而不是重新引用每个引用的属性。)
为了安全起见,你应该使数组成为不可变的NSArray并使属性成为只读。
答案 1 :(得分:1)
您不必担心此self.pointArray = tempArray;
,因为NSMutableArray
是NSArray
的子类。也许为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];