代码之家  ›  专栏  ›  技术社区  ›  fuzzygoat

分配,可变到不可变数组?

  •  3
  • fuzzygoat  · 技术社区  · 15 年前

    有人能确认一下我对这件事的理解是否正确吗。我对此的最初响应是,mutableArray在分配给immutableArray时将成为immutableArray,但事实并非如此。

    这是因为初始数组被分配为mutableArray,而immutableArray被分配为指向同一个对象。编译器发出警告,但代码在运行时执行得很好。

    NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"Teddy", @"Dog", nil];
    NSArray *iArray = mArray;
    [iArray addObject:@"Snoss"]; // Normally this would crash NSArray
    

    非常感谢

    4 回复  |  直到 15 年前
        1
  •  5
  •   Brad    15 年前

    不要混淆物理对象 创建 铸造 在你的密码里。

    实际创建NSMutableArray。

    问题是,由于试图对 编译程序 思维只是一种不安,因为这就是它的身体类型。

    工作 NSMutableArray,在运行时 会响应那个选择器 .

    这样做是不好的编码实践,因为NSArray实际上没有响应addObject选择器。例如,我可以创建一个函数,比如:

    -(void) addIt:(NSArray)myThing {
      [myThing addObject:@"New String"];
    }
    

    不过,这是一种不好的做法,因为如果你真的通过了NSArray,它就会崩溃。

    总结: 真的是 解释为

        2
  •  2
  •   Yuras    15 年前

    是的,你说得对。你应该这么做

    NSArray *array = [NSArray arrayWithArray:mutableArray];
    

        3
  •  1
  •   Erdemus    15 年前

    您的iArray实际上引用了NSMutableArray实例,这就是它是NSMutableArray的原因。

    Obj-c对类类型没有严格的检查,所有对象的类型都是'id'。 你可以写

    NSNumber *iArray = mArray
    

    不要乱用指针,在C++中没有对象类型转换。(有用于将对象转换到另一个类的可重载运算符)。

        4
  •  0
  •   Rengers    15 年前

    阿飞,你是对的。NSMutableArray是NSArray的一个子类,因此可以在这里毫无问题地将mArray分配给iArray。

    但是,它不是干净的代码,您应该避免它。