创建数组。
3种常用方法遍历数组。
可变数组NSMutableArray。
所有的笔记记录在代码的注释中,几乎一句一注释,通俗易懂。
代码部分如下:
#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSArray * array = [[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];
// 数组的元素可以是任意的对象。
// 数组中装有元素的地址,而不是对象的本体。
// 所以一个对象@"One"可以放在两个数组中。即两个数组可以装同一个对象的地址。
// 数组更接近于C当中的链表
// 遍历打印数组中的每个元素
NSLog(@"%@", array);
// 打印数组,就是打印了数组中的每一个元素。
// 任何一个对象,使用%@去打印,就是打印这个对象的description方法的返回值。
// 在dog类中重写了description方法,用%@打印dog,则会调用该方法。
Dog * dog = [[Dog alloc] init];
NSLog(@"%@", dog);
// Dog中有description方法,则dog对象也可以放到数组中。
NSArray * array2 = [[NSArray alloc] initWithObjects:@"One", @"Two", dog, nil];
NSLog(@"array2: %@", array2);
// 打印结果中This is a dog外面加了双引号,是因为他有多个单词。
// 遍历数组的3种方法
// 枚举器法
// 创建一个枚举器,使用数组的元素创建一个枚举器。
NSEnumerator * enumerator = [array objectEnumerator];
id obj;
// 该方法第一次返回数组中第一个元素的地址,第二次返回第二个地址....最后一次返回nil
// 返回nil的时候,赋值表达式的值也是nil,循环结束
while (obj = [enumerator nextObject]) {
NSLog(@"enumerator array: %@", obj);
}
// 快速枚举法
for (id obj2 in array) {
NSLog(@"fast enumerator array: %@", obj2);
}
// 使用i值遍历
// 数组中有两个方法
// [array count]方法返回数组元素的个数
// [array objectAtIndex:]方法返回单个元素的地址
NSInteger i;
for (i = 0; i < [array count]; i++) {
NSLog(@"i with array loop: %@", [array objectAtIndex:i]);
}
// 以上的数组均是不可变数组,在创建之后元素的个数和顺序不可变
// 可变数组 MutableArray
NSMutableArray * mArray = [[NSMutableArray alloc] init];
// 增加元素
[mArray addObject:@"mOne"];
[mArray addObject:@"mTwo"];
[mArray addObject:@"mThree"];
NSLog(@"MutableArray mArray: %@", mArray);
// 删除元素
// [mArray removeObject:@"mOne"];
// NSLog(@"removeObject mArray: %@", mArray);
// 用@”“创建的字符串对象,如果完全一样,那么就是同一个对象,地址一样。
// 删除指定的第几个字符串
// [mArray removeObjectAtIndex:1];
// NSLog(@"remove at Index mArray: %@", mArray);
// 交换两个数组元素的位置
[mArray exchangeObjectAtIndex:0 withObjectAtIndex:2];
NSLog(@"exchange mArray: %@", mArray);
// 可变字符串数组也可以像不可变数组那样遍历
// 但是在枚举遍历中不能删除数组中的元素
// NSMutableArray * mmArray = [[NSMutableArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];
// NSEnumerator * enu = [mmArray objectEnumerator];
// NSString * mStr;
// while (mStr = [enu nextObject]) {
// [mmArray removeLastObject];
// }
// NSLog(@"enumerator mmArray: %@", mmArray);
// 程序发生奔溃
// 实际上只有第一次循环可以执行
// 当对第一次数组进行修改之后
// 第二次使用枚举法遍历就会奔溃
// 但是,如果我们进行逆序遍历,生成一个逆序枚举器,再修改就没有任何问题。
NSMutableArray * mmArray = [[NSMutableArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];
NSEnumerator * enu = [mmArray reverseObjectEnumerator];
NSString * mStr;
while (mStr = [enu nextObject]) {
[mmArray removeLastObject];
NSLog(@"%@", mStr);
}
NSLog(@"%@", mmArray);
// 快速枚举法不能修改,i值可以随意修改
// 数组和字符串的联合使用
NSString * sstr = @"I am a so bad man";
// 按每个单词分开逆序表示
// 首先将字符串进行分割,分割出的字符串放在数组中
// 函数按参数分割字符串,创建一个数组,返回数组的地址
NSArray * sArray = [sstr componentsSeparatedByString:@" "];
NSLog(@"sArray: %@", sArray);
// 创建一个空的可变数组
NSMutableArray * mutaleArray = [[NSMutableArray alloc] init];
// 对数组sArray逆序的遍历
NSEnumerator * enumerator1 = [sArray reverseObjectEnumerator];
NSString * obj1;
while (obj1 = [enumerator1 nextObject]) {
// 一次添加到mutableArray数组里面
[mutaleArray addObject:obj1];
}
NSLog(@"mutableArray: %@", mutaleArray);
// 再拼回成字符串
// 用参数连接数组中的每个字符串
NSString * newStr = [mutaleArray componentsJoinedByString:@" "];
NSLog(@"%@", newStr);
}
return 0;
}
打印结果如下:
2015-06-02 14:45:56.268 NSArray[16559:4906236] (
One,
Two,
Three
)
2015-06-02 14:45:56.269 NSArray[16559:4906236] This is a dog!
2015-06-02 14:45:56.269 NSArray[16559:4906236] array2: (
One,
Two,
"This is a dog!"
)
2015-06-02 14:45:56.274 NSArray[16559:4906236] enumerator array: One
2015-06-02 14:45:56.274 NSArray[16559:4906236] enumerator array: Two
2015-06-02 14:45:56.274 NSArray[16559:4906236] enumerator array: Three
2015-06-02 14:45:56.275 NSArray[16559:4906236] fast enumerator array: One
2015-06-02 14:45:56.275 NSArray[16559:4906236] fast enumerator array: Two
2015-06-02 14:45:56.275 NSArray[16559:4906236] fast enumerator array: Three
2015-06-02 14:45:56.275 NSArray[16559:4906236] i with array loop: One
2015-06-02 14:45:56.275 NSArray[16559:4906236] i with array loop: Two
2015-06-02 14:45:56.275 NSArray[16559:4906236] i with array loop: Three
2015-06-02 14:45:56.276 NSArray[16559:4906236] MutableArray mArray: (
mOne,
mTwo,
mThree
)
2015-06-02 14:45:56.276 NSArray[16559:4906236] exchange mArray: (
mThree,
mTwo,
mOne
)
2015-06-02 14:45:56.276 NSArray[16559:4906236] Three
2015-06-02 14:45:56.276 NSArray[16559:4906236] Two
2015-06-02 14:45:56.276 NSArray[16559:4906236] One
2015-06-02 14:45:56.276 NSArray[16559:4906236] (
)
2015-06-02 14:45:56.276 NSArray[16559:4906236] sArray: (
I,
am,
a,
so,
bad,
man
)
2015-06-02 14:45:56.277 NSArray[16559:4906236] mutableArray: (
man,
bad,
so,
a,
am,
I
)
2015-06-02 14:45:56.277 NSArray[16559:4906236] man bad so a am I