您的位置:首页 > 其它

OC笔记,数组NSArray

2015-06-02 14:46 337 查看
创建数组。

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: %
4000
@", 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OC NSArray