首先声明的是,与C语言的数组不同,Objective-C的是数组只能用来存储对象,而不是存储int 、double、char等基础数据类型,一般要存这些基础数据类型,对于我这个刚学 Objective-C的新手来说,我的做法是将有关数字的基础类型 如 int 、double、char首先转换成一个叫做 NSNumber的类 char*类型的转换成 Objective-C的字符串 NSString 类来进行储存,相关 NSNumber 和 NSString 在以后我学习到的时候会来总结一下我的学习成果。
Objective-C的数组分为两种,一种叫做不可变数组(NSArray),一种叫做可变数组(NSMutableArray),NSMutableArray类是NSArray类的一个子类。
(1)不可变数组(NSArray) ---------该类型在确定之后,不能进行数组元素的更改以及交换
/
// main.m
// NSArray(不可变数组) 博客
//
// Created by YueWen on 15/9/8.
// Copyright (c) 2015年 YueWen. All rights reserved.
//#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {/**不可变数组 NSArray*//*数组的常用的基本初始化*///objc方式的创建对象的普遍方法,init是NSObject的方法,几乎所有的类都是继承于NSObject 类NSArray * array1 = [[NSArray alloc] init];//这种创建对象的方法与上面实质是相同的,只不过上面的是便利初始化函数,下面的是便利构造器来创建,下面就不再注释是便利初始化函数还是便利构造器NSArray * array2 = [NSArray array];//一种和java 一样的创建对象的方法,刚从java 转过来的程序员会比较青睐与这种初始化NSArray * array3 = [NSArray new];//根据数组 array1 来创建数组对象 array4 和 array5NSArray * array4 =[[NSArray alloc]initWithArray:array1];NSArray * array5 = [NSArray arrayWithArray:array1];//通过方法来初始化数组里面的数据,注意后面不要丢了nilNSArray * array6 = [[NSArray alloc]initWithObjects:@"Run",@"Into",@"Love",nil];NSArray * array7 = [NSArray arrayWithObjects:@"Run",@"Into",@"Love",nil];//最简洁的直接赋值创建数组NSArray * array8 = @[@"Run",@"Into",@"Love"];/*不可变数组的 常用方法*//*** 在array8的所有的元素后面,追加一个元素@“Yue”,返回给array9* 此时 array9 的元素的个数为4 元素分别为 @“Run” @"Into" @"Love" @"Yue"* 注:必须要有一个数组来接收返回值 ,不可变数组是不能改变自身的,执行完方法之后,array8是没有任何变化的*/NSArray * array9 = [array8 arrayByAddingObject:@"Yue"];/*** 在array8的所有的元素后面,追加 数组 的所有的元素 返回给array10* 此时 array10 的元素的个数为10 元素分别为 @“Run” @"Into" @"Love" @"Run" @"Into" @"Love"*/NSArray * array10 = [array8 arrayByAddingObjectsFromArray:array8];/*** 将 array8 的所有的元素 通过 @"_"连接起来,组成一个字符串对象* 结果是: s = Run_Into_Love*/NSString * s = [array8 componentsJoinedByString:@"_"];/*** 判断数组 array8 中是否有 值为@“Run”的 NSString 对象(不一定必须是字符串,因为数组中可以存各种对象)* 结果是: contain = YES;*/BOOL contain = [array8 containsObject:@"Run"];/*** 返回的是 值为@“Love” 的 NSString 对象 在数组 array8中的下标数* 结果是: index1 = 2;*/NSInteger index1 = [array8 indexOfObject:@"Love"];/*** 比较两个数组是否相同* 结果是: isEqual = NO;*/BOOL isEqual = [array8 isEqualToArray:array9];/*** 返回的是数组 array8 的第一个元素对象* 结果是:firstObject = @"Run"*/NSString * firstObject = [array8 firstObject];/*** 返回的是数组 array8 的最后一个元素对象* 结果是:lastObject = @"Love"*/NSString * lastObject = [array8 lastObject];/*** 获取数组 array8 中下标为1的元素对象* 结果是:object = @"Into"*/NSString * object = [array8 objectAtIndex:1];return 0;
}
(2)可变数组(NSMutableArray)-------该类型在确定之后,可以进行元素的增、删、改(包括元素的位置 以及 数组的元素个数)
//
// main.m
// NSMutableArray (可变数组)博客
//
// Created by YueWen on 15/9/9.
// Copyright (c) 2015年 YueWen. All rights reserved.
//#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {/*** 可变数组*//*可变数组的常用初始化方法*///objc方式的创建对象的普遍方法,init是NSObject的方法,几乎所有的类都是继承于NSObject 类NSMutableArray * mArray1 = [[NSMutableArray alloc]init];//使用 可变数组 的 便利构造器 来完成初始化NSMutableArray * mArray2 = [NSMutableArray array];//一种和java 一样的创建对象的方法,刚从java 转过来的程序员会比较青睐与这种初始化NSMutableArray * mArray3 = [NSMutableArray new];//根据数组 mArray1 来创建 数组对象 mArray4NSMutableArray * mArray4 = [[NSMutableArray alloc]initWithArray:mArray1];NSMutableArray * mArray5 = [NSMutableArray arrayWithArray:mArray1];//初始化数组的时候 默认的元素个数是3个 但是对于可变数组无所谓,因为后面是可以加的NSMutableArray * mArray6 = [[NSMutableArray alloc]initWithCapacity:3];NSMutableArray * mArray7 = [NSMutableArray arrayWithCapacity:3];//通过事先放入几个元素对象 来完成初始化,但是一定不要忘记后面的nilNSMutableArray * mArray8 = [[NSMutableArray alloc]initWithObjects:@"Run",@"Into",@"Love",nil];NSMutableArray * mArray9 = [NSMutableArray arrayWithObjects:@"Run",@"Into",@"Love", nil];/*** 可变数组 的常用数据处理方法* 以下实例用 原型用mArray9*//*** 为数组添加元素,实例是在数组最后添加元素@“Yue”* 方法执行前:mArray9 = @[@"Run",@"Into",@"Love"]* 方法执行后:mArray9 = @[@"Run",@"Into",@"Love",@"Yue"]*/[mArray9 addObject:@"Yue"];/*** 为数组添加元素,与上例不同的是,是将mArray8的所有的元素都追加到mArray9中* 方法执行前:mArray9 = @[@"Run",@"Into",@"Love",@"Yue"]* 方法执行后:mArray9 = @[@"Run",@"Into",@"Love",@“Yue”,@“Run”,@“Into”,@"Love"]*/[mArray9 addObjectsFromArray:mArray8];/*** 将数组的最后一个元素对象从数组中删除* 方法执行前:mArray9 = @[@"Run",@"Into",@"Love",@“Yue”,@“Run”,@“Into”,@"Love"]* 方法执行后:mArray9 = @[@"Run",@"Into",@"Love",@“Yue”,@“Run”,@“Into”]*/[mArray9 removeLastObject];/*** 删除数组中存在的某个对象,如果这个对象存在多个相同的,都会被删除* 方法执行前:mArray9 = @[@"Run",@"Into",@"Love",@“Yue”,@“Run”,@“Into”]* 方法执行后:mArray9 = @[@"Run",@"Into",@"Love",@“Run”,@“Into”]*/[mArray9 removeObject:@"Yue"];/*** 删除数值中的存在的某个对象。只不过相比上一个方法,该方法存在范围** @param 1 表示从下标为(包含)的元素对象开始查找* @param 3 表示查找的个数** 方法执行后前:mArray9 = @[@"Run",@"Into",@"Love",@“Run”,@“Into”]* 该方法表示 从 @“Into”开始,查找往后的3个,如果存在@“Run”,就删除,没有就不作为* 方法执行后:mArray9 = @[@"Run",@"Into",@"Love",@“Into”]*/[mArray9 removeObject:@"Run" inRange:NSMakeRange(1, 3)];/*** 表示删除数组中下标为3 的元素对象 (使用这个方法小心数组越界)* 方法执行前:mArray9 = @[@"Run",@"Into",@"Love",@“Into”]* 方法执行后:mArray9 = @[@"Run",@"Into",@"Love"]*/[mArray9 removeObjectAtIndex:3];/*** 表示从mArray9中删除所有的mArray8 存在的对象元素* 因为mArray8 和 mArray9 中的元素相同,所以执行完毕后 数组mArray9中没有任何元素了* 方法执行前:mArray9 = @[@"Run",@"Into",@"Love"]* 方法执行后:mArray9 = @[]*/[mArray9 removeObjectsInArray:mArray8];/*** 表示从mArray8中删除范围的元素** @param 0 从下标为0的元素开始* @param 2 删除元素的个数** 方法执行前:mArray8 = @[@"Run",@"Into",@"Love"]* 方法执行后:mArray8 = @[@"Love"]*/[mArray8 removeObjectsInRange:NSMakeRange(0, 2)];/*** 删除数组mArray8中的所有的对象元素* 方法执行前:mArray8 = @[@"Love"]* 方法执行后:mArray8 = @[]*/[mArray8 removeAllObjects];//因为数组的元素都已经没有,所以初始化一个,为后面的实例继续做例子[mArray9 addObjectsFromArray:@[@"Run",@"Into",@"Love"]];/*** 表示在可变数组中插入对象元素* 在下标为2的位置插入一个@”Yue“的字符串对象* 方法执行前:mArray9 = @[@"Run",@"Into",@"Love"]* 方法执行后:mArray9 = @[@"Run",@"Into",@"Yue",@"Love"]*/[mArray9 insertObject:@"Yue" atIndex:2];/*** 表示在可变数组中替换对象元素* 将下标为2的位置的元素 用字符串对象@“Wen”替换* 方法执行前:mArray9 = @[@"Run",@"Into",@"Yue",@"Love"]* 方法执行后:mArray9 = @[@"Run",@"Into",@"Wen",@"Love"]*/[mArray9 replaceObjectAtIndex:2 withObject:@"Wen"];/*** 表示将可变数组中的对象元素交换位置* 将下标为2位置的元素 和 下标为3位置的元素 交换位置* 方法执行前:mArray9 = @[@"Run",@"Into",@"Wen",@"Love"]* 方法执行后:mArray9 = @[@“Run",@"Into",@"Love",@"Wen"]*/[mArray9 exchangeObjectAtIndex:2 withObjectAtIndex:3];return 0;
}
/*****
***数组的遍历 (我所了解的目前有三种方式)
****/
1、枚举器法 (这种方法在遍历过程中不能改变数组的个数以及元素的位置,不然会出错)
NSEnumerator * enumerator = [mutableArray objectEnumerator];//构造枚举器
id obj;
while (obj = [enumerator nextObject]) {
//obj既为元素
}
2、快速枚举法 (有的叫做 快速for循环) (这种方法依旧在遍历过程中不能改变数组的个数以及元素的位置,不然会出错)
for(id obj in mutableArray){
//obj既为元素
} //这种方法他们都说是最快的,我也就当作最快的来用
对于枚举器,还有一种叫做逆序枚举器,方法如下
NSEnumerator *enumrator = [mutableArray reverseObjectEnumerator];//构造逆序枚举器,用法同枚举器一样,但不一样的是,用逆序枚举器遍历的时 候,以上两种方法可以改变数组的个数以及元素的位置。
3、使用for循环进行遍历 (这种遍历方法可以在循环中改变数组的个数以及元素的位置)
for (int i = 0; i < [mutableArray count]; i++) {
id obj = [mutableArray objectAtIndex:i];// obj既为元素
}