【问题标题】:Instantiate an NSArray passing a mutable array changes array to mutable?实例化一个传递可变数组的 NSArray 将数组更改为可变数组?
【发布时间】:2012-05-21 12:02:34
【问题描述】:

如果我实例化一个 NSArray 并传递一个 NSMutableArray,它会变成一个 NSArray 还是只是看起来是一个。

即可变数组最终释放了吗

- (NSArray *)getObjectivesWithPerspective:(Perspective *)perspective
{
    NSMutableArray *result = [NSMutableArray array];

    for (ObjectiveManagedObject *objective in self.objectives)
    {
        if (objective.perspective.objectID == perspective.objectID) {
            [result addObject:objective];
        }
    }

    return [NSArray arrayWithArray:result];
}

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    看到这个答案:https://stackoverflow.com/a/1392051/254422

    基本上,它将对象复制到一个新的、自动释放的、不可变的 NSArray。

    使用 +array 创建的 NSMutableArray 是自动释放的。

    【讨论】:

    • 您可能需要重新阅读Advanced Memory Management Programming Guide——您所说的规则不正确。根据指南,“您使用名称以“alloc”、“new”、“copy”或“mutableCopy”开头的方法创建对象(例如,allocnewObjectmutableCopy) 。”
    • 您可能想阅读 NSArray 类参考。 +arrayWithArray: "创建并返回一个包含另一个给定数组中的对象的数组。"仅仅因为特定的静态方法 +arrayWithArray: 不以 alloc、new、copy 或 mutableCopy 开头,并不意味着它下面的任何底层代码都没有。
    • 其实Objective-C没有静态方法;它有完全不同的类方法。不确定您认为NSArray 类引用与内存管理的命名规则有什么相关性,但您关于“方法不以 new/create 或 init 开头”的说法完全错误。
    • 啊,我以为你在争论从 +arrayWithArray: 返回的 NSArray 不是一个新对象,因为它不是用 alloc、new、copy 或 mutableCopy 调用的。我已经更新了答案。
    【解决方案2】:

    您可以在此处找到有关此的一些信息:what does -arrayWithArray actually DO?。但是你得到的数组应该是不可变的。 NSArray 会将引用复制到不可变数组中。

    如有疑问,请进行测试。从方法中获取一个数组,将其转换为 NSMutableArray 并尝试添加一个对象。执行此操作时应该会出现错误。

    【讨论】:

      【解决方案3】:

      由于NSMutableArrayNSArray的子类,你可以直接返回result而不需要创建一个新的NSArray对象:

      - (NSArray *)getObjectivesWithPerspective:(Perspective *)perspective
      {
          NSMutableArray *result = [NSMutableArray array];
      
          for (ObjectiveManagedObject *objective in self.objectives)
          {
              if (objective.perspective.objectID == perspective.objectID) {
                  [result addObject:objective];
              }
          }
      
          return result;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-28
        • 1970-01-01
        • 2011-05-12
        • 2019-01-19
        • 2023-04-06
        相关资源
        最近更新 更多