在iOS开发中我们经常使用到的到数据类型为数组和字典,在这里我们给基础学员讲解一下数组和字典的使用方式。
数组分为不可变数组NSArray和可变数组NSMutableArray,字典也一样分为不可变字典NSDictionary和NSMutableDictionary
其中继承关系看下图:
一:不可变数组
(1).初始化:
首先我们说一下数组,对于不可变数组来说,其内容的赋值是需要你在初始化的时候进行的,它的初始化方法分为很多,我们来看一下:
在使用创建对象的方法的时候,需要你有选择的使用,比如通过实例化方法 -initWithObjects:
- NSArray *myArray = [[NSArray alloc] initWithObjects:@"hello",@"nihao", nil nil];
上面的代码是通过实例化方法进行创建的,因为出现了alloc,所以需要在使用完后对其进行释放,即添加
- [myArray release];
而另外一种创建方法是类方法,需要由类来进行调用:+arrayWithObjects:
- NSArray *arr = [NSArray arrayWithObjects:@"hello",@"nihao", nil nil];
由于系统在类方法中给我们添加了自动释放即:autorelease,所以我们不需要对其内存进行管理。
OK,对于不可变的数组我们会了基本的使用,记住,不可变数组只能够在初始化的时候对其进行赋值,其它情况下不能够赋值。
(2).不可变数组之间的赋值
在后期的使用过程中我们经常会把A数组里面的内容赋值给B内容,即将A数组里面所有的内容全部给B,让两者所存的东西都是一样的,方法如下所示:
- //初始化数组A
- NSArray *arrA = [NSArray arrayWithObjects:@"hello",@"nihao", nil nil];
- //将A数组中的内容全部给B数组
- NSArray *arrB = [NSArray arrayWithArray:arrA];
- NSLog(@"arrb == %@",arrB);
- //打印结果:
- 2014-04-08 23:53:07.610 第三天Codereview[17446:60b] arrb == (
- hello,
- nihao
- )
大家可以看到数组B中所存的内容跟A里面的内容一样,我们可以通过以上方法将数组中所有的内容全部赋值给B。
总结:大家一定要注意在数组中所存储的类型是“id”类型,即任意类型的指针对象,也就是说我可以在数组中添加数组对象,也可以添加自定义类对象,或者视图类对象,比如UILabel,UIButton,UIView等,只要是指针类型对象,都可以放到数组里面。
一定要验证上面的“总结”,自己测试一下结果进行试验。
二:可变数组
(1).可变数组的初始化
大家回到第一张图片中看一下,在里面我们详细的列出来了数组的继承关系,即NSMutableArray是继承于NSArray的,那么也就是说可变数组的初始化方法和不可变数组的初始化方法是一样的,没有什么差别。如下:
- NSMutableArray *arrA = [NSMutableArray arrayWithObjects:@"hello",@"nihao", nil nil];
- NSMutableArray *arrC = [[NSMutableArray alloc] initWithObjects:@"aaa",@"bbb", nil nil];
(2) . 可变数组添加对象
可变数组与不可变数组的最大区别就在于可变数组可以不在初始化的时候添加内容。比如现在拥有一个可变数组对象mutableA:
- NSMutableArray *mutableA = [NSMutableArray array];
- [mutableA addObject:@"OB"];
(3).可变数组之间的赋值
当然在可变数组中不仅仅就这样通过addObject来添加内容,在不可变数组中我们讲了将一个数组里面的内容赋值给另外一个数组,那么对于可变数组呢?
- 方式一:通过初始化将数组赋值给另外一个数组
- 初始化数组A
- NSMutableArray *mutableD = [NSMutableArray array];
- [mutableD addObject:@"nihao"];
- //将A数组中的内容全部给B数组
- NSMutableArray *mutableE = [NSMutableArray arrayWithArray:mutableD];
- NSLog(@"mutableE == %@",mutableE);
方式二:通过实例化方法将一个数组里面的内容赋值给另外一个数组
- //初始化数组A
- NSMutableArray *mutableF = [NSMutableArray array];
- [mutableF addObject:@"nihao"];
- //将A数组中的内容全部给B数组
- NSMutableArray *mutableG = [NSMutableArray array];
- [mutableG addObjectsFromArray:mutableF];
注意:大家在敲写以上代码的时候不要忘记打印结果验证一下。
三:数组的读取
对于数组来说有统一的读取方法,如果想要读取数组中的每一个元素,一般用for循环进行遍历,常用的是forin来读取:
- //初始化数组A
- NSMutableArray *mutableF = [NSMutableArray array];
- [mutableF addObject:@"nihao"];
- //将A数组中的内容全部给B数组
- NSMutableArray *mutableG = [NSMutableArray array];
- [mutableG addObjectsFromArray:mutableF];
- for (NSString *value in mutableG) {
- NSLog(@"value == %@",value);
- }
对于forin来说,前面的参数类型是数组中所存储的对象的类型,比如数组中存的是Student类的对象,那么前面就应该写成 for (Student *value in mutableG) ;
上面是对所有内容的读取,如果想要单独读取某一个元素,那么就要用到-objectAtIndex:(NSInteger)index方法来进行读取。这个不解释
以上就是对数组的一个简单使用,要经常打log输出,查看结果。
四:不可变字典
(1).初始化
不可变字典的初始化方法如下所示:
对于不可变字典来说,你会发现它和数组的初始化方法非常相似,只不过对于字典来说多了一个key值,这也是字典的特性。
- NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"对象",@"key", nil nil];
- NSDictionary *dic1 = [[NSDictionary alloc]initWithObjectsAndKeys:@"对象",@"key", nil nil];
一定要记住书写方式,在初始化的时候前面是放置对象的,后面是放key值的,而key值我们通常用字符串而已。
(2).不可变字典的赋值
和数组一样,不可变字典也可以把一个已经存在的字典A全部赋值给字典B,但是记住,对于不可变字典来说必须通过初始化来操作:
- //字典A
- NSDictionary *dic1 = [[NSDictionary alloc]initWithObjectsAndKeys:@"对象",@"key", nil nil];
- //字典B
- NSDictionary *dic2 = [NSDictionary dictionaryWithDictionary:dic1];
- 或者用下面的也能赋值:
- NSDictionary *dic2 = [[NSDictionary alloc]initWithDictionary:dic1];