OC笔记,数组NSArray

创建数组。

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值