【问题标题】:Altering an instance NSArray改变一个实例 NSArray
【发布时间】:2012-10-18 16:51:40
【问题描述】:

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

【问题讨论】:

  • 你试过[self.pointArray mutableCopy]吗?
  • 您没有泄漏,因为arrayWithArray 返回了一个自动释放的对象

标签: objective-c ios


【解决方案1】:

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

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

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

【讨论】:

  • 是的,我不确定使用实例可变数组是否是一个禁忌,所以我做了一个快速的谷歌搜索。发现几个人出于这些原因推荐使用不可变的。没有考虑将其设为只读。 TBH,我不需要担心这个程序的原子性,但我认为这是一个很好的做法。
  • @Log139 - 当然,“安全性”对于 99% 的应用程序来说并不重要,因为一小部分人可以访问所有源并且可以更改任何内容。无论如何,Objective-C 并不像 Java 那样真正“安全”。 “安全”实际上只能防止意外修改和“哎呀,我真的应该以'正确'的方式去做,但我没有时间”修改。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    您不必担心这个self.pointArray = tempArray;,因为NSMutableArrayNSArray 的子类。可能会为NSMutableArray 分配更多内存,但这根本不是问题——不用担心。

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

    如果你有,你会在相反的情况下遇到问题

    @property (strong, nonatomic) NSMutableArray *pointArray;

    而你试图做 self.pointArray = tempArray; 是 tempArray 是 NSArray*

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

    【讨论】:

      【解决方案4】:

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

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

      self.pointArray = [NSArray arrayWithArray:tempArray];
      

      【讨论】:

        猜你喜欢
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 2014-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-24
        • 1970-01-01
        相关资源
        最近更新 更多