OC笔记,数组NSArray

本文详细介绍了Objective-C中数组的创建、遍历方法及可变数组的使用技巧。包括三种常用的数组遍历方式:枚举器法、快速枚举法和使用索引遍历,并演示了如何使用可变数组进行元素的增删改操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建数组。

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
内容概要:文章基于4A架构(业务架构、应用架构、数据架构、技术架构),对SAP的成本中心和利润中心进行了详细对比分析。业务架构上,成本中心是成本控制的责任单元,负责成本归集与控制,而利润中心是利润创造的独立实体,负责收入、成本和利润的核算。应用架构方面,两者都依托于SAP的CO模块,但功能有所区分,如成本中心侧重于成本要素归集和预算管理,利润中心则关注内部交易核算和获利能力分析。数据架构中,成本中心与利润中心存在多对一的关系,交易数据通过成本归集、分摊和利润计算流程联动。技术架构依赖SAP S/4HANA的内存计算和ABAP技术,支持实时核算与跨系统集成。总结来看,成本中心和利润中心在4A架构下相互关联,共同为企业提供精细化管理和决策支持。 适合人群:从事企业财务管理、成本控制或利润核算的专业人员,以及对SAP系统有一定了解的企业信息化管理人员。 使用场景及目标:①帮助企业理解成本中心和利润中心在4A架构下的运作机制;②指导企业在实施SAP系统时合理配置成本中心和利润中心,优化业务流程;③提升企业对成本和利润的精细化管理水平,支持业务决策。 其他说明:文章不仅阐述了理论概念,还提供了具体的应用场景和技术实现方式,有助于读者全面理解并应用于实际工作中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值