为什么可变对象(NSMutableArray 和 NSMutableDictionary)需要 alloc- init?而我们可以直接为不可变对象赋值

Why mutable object(NSMutableArray and NSMutableDictionary) required alloc- init?while we can directly assign value to immutable objects

提问人:AbcUser 提问时间:4/8/2017 最后编辑:rmaddyAbcUser 更新时间:4/8/2017 访问量:178

问:

//Mutable object...


//first initialize

NSMutablearray *arr=[[NSMutableArray alloc]init];


//then add value

[arr addobjects:@"iPhone",@"Android",nil];




//But we can assign value immutable array without initialize

NSArray *brr=@[@"iPhone",@"Android"];
目标-C 阵 列 可变

评论

1赞 Christoph 4/8/2017
您能否缩短标题并在问题正文中添加相关信息和您遇到的问题?

答:

3赞 Rob Napier 4/8/2017 #1

有很多方法可以初始化。例如:NSMutableArray

NSMutableArray *arr = [NSMutableArray arrayWithObjects: @"iPhone", @"Android", nil];

文字语法是 ObjC 的一个相当新的补充,它返回一个(不可变的),这就是为什么你不能直接将其分配给 .这只是 .不过,如果您想使用该语法,您仍然可以:@[]NSArrayNSMutableArray[NSArray arrayWithObjects:count:]

NSArray *brr = [@[@"iPhone",@"Android"] mutableCopy];

评论

1赞 bbum 4/8/2017
需要注意的是,除了句法糖之外,没有直接分配不可变值。语法只是动态方法调用的简写;就编译器输出的内容而言,简写和方法调用形式之间没有区别。
1赞 Dima 4/8/2017 #2

这就是字面语法的方式。在 Objective-C 中,它创建一个 .如果你真的想使用语法,但最终得到一个可变数组,你可以使用这样的副本:NSArray

NSMutableArray *brr=@[@"iPhone",@"Android"].mutableCopy;

这个系统在 Swift 中要好得多,它只是一个值类型调用,你可以用 a 或 a 来设置可变性Arrayvarlet

var myArray = ["iPhone", "Android"] // mutable
let myArray = ["iPhone", "Android"] // immutable
1赞 matt 4/8/2017 #3

您反对两步过程:

//first initialize
NSMutableArray *arr=[[NSMutableArray alloc]init];
//then add value
[arr addobjects:@"iPhone",@"Android",nil];

你说你宁愿写一个文字数组:

NSArray *brr=@[@"iPhone",@"Android"];

因此,将它们组合起来:

NSMutableArray* arr = [NSMutableArray arrayWithArray: @[@"iPhone",@"Android"]];
0赞 Owen Zhao 4/8/2017 #4

因为文字的类型是不可变的。此外,您应该记住 NSMutableArray 是 NSArray 的子类。您可以将子类的实例分配给其超类,但不能将其分配给其超类。