0

我有一个实例数组,我最终会根据用户设置进行更改。我将其设置为不可变的 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

4 回答 4

2

你有什么顾虑?对于这种情况,人们可能会关注原子性、针对其他人修改数组的安全性、两者都没有,或两者兼而有之。如果您都不关心,只需将您的属性设为 NSMutableArray 并就地修改它。

如果您担心原子性,您应该制作一个副本,修改副本,然后将其换入(但是,当然,对象的所有用户都必须知道为一系列“原子”创建自己的指针的私有副本" 引用,而不是为每个引用重新引用属性)。

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

于 2012-10-18T17:34:36.193 回答
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;在那种情况下做你会遇到问题

于 2012-10-18T17:04:57.087 回答
1

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

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

但是,如果您不关心这里的抽象(或者如果该属性不是公共的),那么首先声明 type 的属性会更容易NSMutualArray *

于 2012-10-18T17:13:22.527 回答
0

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

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

self.pointArray = [NSArray arrayWithArray:tempArray];
于 2012-10-18T17:09:29.720 回答