NSArray / NSDictionary 的基本介绍和使用

本文详细介绍了Objective-C中的数组(NSArray)和字典(NSDictionary)的基本使用方法,包括创建、访问、遍历和文件操作等内容。同时,还探讨了它们之间的区别以及在实际应用中的注意事项。

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

&&回顾C语言中的数组使用方法
int a[5] = {1,2};
int *pa[3]; //数组长度为3
特点: 1.集合 2.类型相同 3.有序(下标/内存连续)
弊端:1.只能存放一种类型的数据(类型必须一致)
2.不能方便地动态地添加、删除数组元素(长度固定)

&&NSArray数组
NSArray是OC中数组类
特点:1只能存放任意OC对象,并且是有序的
2不能存储非OC对象,比如int\float\double\char\enum\struct等
3它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的,不能删除里面的元素,也不能再往里面添加元素

1.NSArray 的创建方式
NSArray的类方法创建

+ (instancetype)array;    //空数组
+ (instancetype)arrayWithObject:(id)anObject;
+ (instancetype)arrayWithObjects:(id)firstObj,...;
+ (instancetype)arrayWithArray:(NSArray *)array;
+ (id)arrayWithContentsOfFile:(NSString *)path; //读取一个xml文件
+ (id)arrayWithContentsOfURL:(NSURL *)url; //读取一个xml文件
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        // NSArray特点:
        // 一旦创建成功,内容不可改变
        // 只能存放OC对象

        //1.创建一个空数组
        // 这样的数组永远是空的,不可能向其中增加值(不可变性)
        NSArray *arr1 = [NSArray array];
        NSLog(@"arr1 = %@",arr1);
        //2.创建数组,只有一个元素 (id 对象类型)
        NSArray *arr2 = [NSArray arrayWithObject:@"1"];
        NSLog(@"arr2 = %@",arr2);
        //3.创建数组,有多个元素
        // nil 表示数组赋值结束,最后一个元素
        // nil不可以包含在数组中
        // 常见写法
        NSArray *arr3 = [NSArray arrayWithObjects:@"one",@"two",@1, nil];
        NSLog(@"arr3 = %@",arr3);
        //4.调用对象方法,创建数组
        NSArray *arr4 = [[NSArray alloc] initWithObjects:@"three",@"four", nil];
        NSLog(@"arr4 = %@",arr4);
        //5.用一个数组可以创建另外一个数组
        NSArray *arr5 = [NSArray arrayWithArray:arr3];
        NSLog(@"arr5 = %@",arr5);

        NSLog(@"Hello, World!");
    }
    return 0;
}

打印结果

 arr1 = (
)
 arr2 = (
    1
)
 arr3 = (
    one,
    two,
    1
)
 arr4 = (
    three,
    four
)
 arr5 = (
    one,
    two,
    1
)

nil用法

NSArray *arr3 = [NSArray arrayWithObjects:@"one",@"two",@1, nil];
        NSLog(@"arr3 = %@",arr3);

打印结果

rr3 = (
    one
)

NSNull用法

NSArray *arr3 = [NSArray arrayWithObjects:@"one",[NSNull null],@"two",@1, nil];

打印结果

 arr3 = (
    one,
    "<null>",
    two,
    1
)

2.NSArray的常见用法

// 获取集合元素个数
- (NSUInteger)count;
// 获得index位置的元素 (下标)
- (id)objectAtIndex:(NSUInteger)index;
// 判断是否包含某一个元素
- (BOOL)containsObject:(id)anObject;
// 返回第一个元素
- (id)firstObject;
// 返回最后一个元素
- (id)lastObject;
// 查找anObject元素在数组中的位置(如果找不到,返回-1)NSNotFound
- (NSInteger)indexOfObject:(id)anObject;
// 在range范围内查找anObject元素在数组中的位置
- (NSInteger)indexOfObject:(id)anObject inRange:(NSRange)range;
#import <Foundation/Foundation.h>

void test() {
// 数组常见方法
        NSArray *arr3 = [NSArray arrayWithObjects:@"one",@"two",@1,@"three", nil];
        NSLog(@"arr3 = %@",arr3);

        // 1.获得数组的长度 count获取数组元素个数
        NSLog(@"%ld",arr3.count);

        // 2.根据下标,获取下标2对应的对象,即第三个元素“1”
        NSLog(@"%@",[arr3 objectAtIndex:2]);

        // 3.返回元素的下标 用无符号整形数接收下标
        NSUInteger loc = [arr3 indexOfObject:@"three"];
        NSLog(@"%ld",loc);

        // 4.数组中是否包含了某个元素
        // [arr3 containsObject:@"one"];
        if ([arr3 containsObject:@"one"]) {
            NSLog(@"包含此元素");
        } else {
            NSLog(@"不包含");
        } //打印结果:包含此元素
}

简化的方式来定义、访问数组

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        // 用简化的方式来定义和访问数组元素
        // 1)用简化的方式,定义数组
        // 格式:@[ 数组元素 ]
        NSArray *arr = @[@"1",@"2",@"3",@4,@"ONE"];
        NSLog(@"arr = %@",arr);

        NSString *str = [arr objectAtIndex:2];
        NSLog(@"%@",str);

        // 2)用简化的方式访问数组元素
        str = arr[1]; //C语言形式的数组访问元素
        NSLog(@"%@",str);
    }
    return 0;
}

打印结果

 arr = (
    1,
    2,
    3,
    4,
    ONE
)
 3
 2

3.NSArray的遍历方法

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        // 定义一个数组
        NSArray *arr = @[@"one",@"two",@"three",@"four"];

        // 对数组进行遍历

        //1) 普通的方式,通过下标访问
        for (int i = 0; i<arr.count; i++) {
            NSLog(@"-> %@",arr[i]);
        }

        //2) 快速枚举法 for循环的增强形式
        for (NSString *str in arr) {
            NSLog(@"---> %@",str);
        }
        //3) 使用block的方式,进行访问
        // id obj数组元素  idx:元素下标  stop:是否停止
        // stop:YES 会停止, stop:NO
        [arr enumerateObjectsUsingBlock:^(id  obj, NSUInteger idx, BOOL *stop) {
            NSLog(@"idx = %ld,obj = %@",idx,obj);
        }];

        //4)
    }
    return 0;
}

打印结果

 -> one
 -> two
 -> three
 -> four
 ---> one
 ---> two
 ---> three
 ---> four
 idx = 0,obj = one
 idx = 1,obj = two
 idx = 2,obj = three
 idx = 3,obj = four
        [arr enumerateObjectsUsingBlock:^(id  obj, NSUInteger idx, BOOL *stop) {
            if (idx == 2) {
                *stop = YES;  //下标为第二个数 停止遍历 // break;
            } else
            {
                NSLog(@"idx = %ld,obj = %@",idx,obj);
            }
        }];

打印结果

 idx = 0,obj = one
 idx = 1,obj = two

4.NSArray读写文件

        NSArray *array = [NSArray arrayWithObjects:@"one",@"two",@"three", @"four",@"five",nil];
        // 把NSArray 中的内容,写入到文件中
        // arr.plist 一种特殊的文件格式 或者为.xml格式
//        [array writeToFile:@"file:///Users/zhaoxiaohu/Desktop/arr.plist" atomically:YES];

        // atomically:YES BOOL值,需要接收一下 修正为
        BOOL isWrite = [array writeToFile:@"Users/zhaoxiaohu/Desktop/arr.plist" atomically:YES];
        if (isWrite) {
            NSLog(@"写入成功");

        // 从文件中,读取一个数组信息
            NSArray *readArr = [NSArray arrayWithContentsOfFile:@"Users/zhaoxiaohu/Desktop/arr.plist"];
            NSLog(@"readArr = %@",readArr);
        }

4.NSArray与字符串
把数组元素链接成字符串

- (NSString *)compomentsJoinedByString:(NSString *)separator:

这是NSArray的方法,用separator作拼接符将数组元素拼接成一个字符串

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 创建一个数组  @1快速转化成对象
        NSArray *arr = @[@1,@2,@3,@4];

        // 1)需求:把数组中的元素用 “-” 连接起来
        // [数组 componentsJoinedByString];
        // 1-2-3-4
        // [arr componentsJoinedByString:@"-"];
        NSString *str = [arr componentsJoinedByString:@"-"];
        NSLog(@"str = %@",str);

        // 2)给一个字符串,分割成一个数组
        // 400-800-12580  //取得400   12580    800
        // componentsSeparatedByString 返回值是NSArray
        NSString *str2 = @"400-800-12580";
        NSArray *arr2 = [str2 componentsSeparatedByString:@"-"];
        NSLog(@"%@",[arr2 firstObject]);
        NSLog(@"%@",[arr2 lastObject]);
        NSLog(@"%@",arr2[1]);
    }
    return 0;
}

打印结果

 str = 1-2-3-4
 400
 12580
 800
        NSString *str2 = @"400-800-12580#400-888-11200";
        NSArray *arr3 = [str2 componentsSeparatedByString:@"#"];
        NSLog(@"arr3 = %@",arr3);

//        [[arr3 firstObject] componentsSeparatedByString:@"-"];
        // 第一个电话的每一部分
        NSArray *arr4 = [[arr3 firstObject] componentsSeparatedByString:@"-"];
        NSLog(@"arr4 = %@",arr4);

        NSArray *arr5 = [[arr3 lastObject] componentsSeparatedByString:@"-"];
        NSLog(@"arr5 = %@",arr5);

打印结果

 arr3 = (
    "400-800-12580",
    "400-888-11200"
)
 arr4 = (
    400,
    800,
    12580
)
 arr5 = (
    400,
    888,
    11200
)

NSDictionary(16)

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //NSDictionary 不可变的,一旦创建,内容就不能添加/删除(不能改变)
        //1)创建空字典
        NSDictionary *dict1 = [NSDictionary dictionary];
        //key     value
        // zs ---> 张三  汉字会打印汉字编码
        // ls ---> 李四
        // mz --->码子
        //2)创建只有一组键值对的字典
        //object:对象 forkey:键值
        NSDictionary *dict2 = [NSDictionary dictionaryWithObject:@"zhangsan" forKey:@"zs"];
        //3)创建多组键值对的字典
        // value值,key值
        NSDictionary *dict3 = [NSDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2", nil];
        // 注意:
        // 字典的key值和value值,都必须是对象

        //4)快速创建一个字典
        // @{,,key值:value值,,,};
        //key值不能重复
        //如果重复了,也不会报错
        //如果重复了,最后添加的将不能够保存到字典中
        NSDictionary *dict4 = @{@"zs":@"zhangsan",@"ls":@"lisi",@"bz":@"banzhang"};

        NSLog(@"%@",dict2); //以%@格式打印字典,控制台输出一个{ }
        NSLog(@"%@",dict3);
        NSLog(@"%@",dict4);
    }
    return 0;
}

打印结果

 {
    zs = zhangsan;
}
 {
    key1 = value1;
    key2 = value2;
}
 {
    bz = banzhang;
    ls = lisi;
    zs = zhangsan;
}

键值对集合的特点
1.字典存储的时候,必须是“键值对”的方式来存储(同时键不要重复)
2.键值对中存储的数据是”无序的”
3.键值对集合可以根据键,快速获取数据

NSDictionary基本使用方法

- (NSUInteger)count;
// 返回字典的键值对数目
- (id)objectForKey:(id)aKey;
// 根据key取出value

NSDictionary遍历方法

        //5)获取字典的长度
        NSLog(@"%lu", dict4.count);
        //6)根据key值(zs)取出value值(zhaosi)
        NSString *str = [dict4 objectForKey:@"zs"];
        NSLog(@"zs = %@",str);

        //7)字典的遍历问题
        //第一步:获取所有的key
        //第二步:根据key获取value
//        for (NSString *key in dict4) {
//            NSLog(@"key = %@",key);
//        }
        for (NSString *key in dict4) {
            NSLog(@"key = %@,value = %@",key,[dict4 objectForKey:key]);
        }
}

打印结果

NS系列[1295:58726] 3
NS系列[1295:58726] zs = zhangsan
key = ls,value = lisi
key = bz,value = banzhang
key = zs,value = zhangsan
        // key:key obj:value stop:stop
        [dict4 enumerateKeysAndObjectsUsingBlock:^(id key, id  obj, BOOL * stop) {
            NSLog(@"%@ ---> %@",key,obj);
        }];

打印结果

ls ---> lisi
 bz ---> banzhang
 zs ---> zhangsan

NSDictionary的简写及文件操作
简写形式

// 以前
[NSDictionary dictionaryWithObjectsAndKeys:@"Jack":@"name",@"男":@"sex",nil];

// 现在
@{@"name":@"Jack",@"sex":@"男"};

NSDictionary获取元素

// 以前
[dict objectForKey:@"name"];
// 现在
dict [@"name"];
        //1)用简写形式定义一个字典
        NSDictionary *dict = @{@"zbz":@"zhangbozhi",@"cgx":@"chenguanxi"};

        //2)用简写形式,获取key对应的value
        NSLog(@"%@",dict[@"zbz"]);

打印结果

zhangbozhi

NSDictionary文件操作
将字典写入文件中

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;
        //1)用简写形式定义一个字典
        NSDictionary *dict = @{@"zbz":@"zhangbozhi",@"cgx":@"chenguanxi"};

        //2)用简写形式,获取key对应的value
        NSLog(@"%@",dict[@"zbz"]);

        //3)把字典保存到文件中 返回值是BOOL型
        BOOL isWrite = [dict writeToFile:@"/Users/fc/dict.plist" atomically:YES];
        if (isWrite) {
            NSLog(@"写入成功");
        }

        //4)从文件中读取字典
        NSDictionary *readDict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/fc/dict.plist"];
        NSLog(@"readDict = %@",readDict);

打印结果

 NS系列[692:17996] zhangbozhi
 NS系列[692:17996] 写入成功
 NS系列[692:17996] readDict = {
    cgx = chenguanxi;
    zbz = zhangbozhi;
}
        // 省 市
        // 辽宁省  大连
        //        沈阳
        // 河北省  保定
        //        石家庄
        //
        NSArray *lnArr = [NSArray arrayWithObjects:@"dalian",@"shenyang", nil];
        NSArray *hbArr = [NSArray arrayWithObjects:@"baoding",@"shijiazhuangn", nil];

        NSDictionary *cities = [NSDictionary dictionaryWithObjectsAndKeys:lnArr,@"ln",hbArr,@"hb", nil];
        NSLog(@"cities = %@",cities);

// 创建离线数据库(字典)
 [cities writeToFile:@"/Users/fc/cities.plist" atomically:YES];

        /*
         ln = (dalian,shenyang)
         hb = (baoding,shijiazhuang)
         */

打印结果

 cities = {
    hb =     (
        baoding,
        shijiazhuangn
    );
    ln =     (
        dalian,
        shenyang
    );
}
#import <Foundation/Foundation.h>
void test() {
    // 省 市
    // 辽宁省  大连
    //        沈阳
    // 河北省  保定
    //        石家庄
    //
    NSArray *lnArr = [NSArray arrayWithObjects:@"dalian",@"shenyang", nil];
    NSArray *hbArr = [NSArray arrayWithObjects:@"baoding",@"shijiazhuangn", nil];

    NSDictionary *cities = [NSDictionary dictionaryWithObjectsAndKeys:lnArr,@"ln",hbArr,@"hb", nil];
    NSLog(@"cities = %@",cities);

    [cities writeToFile:@"/Users/fc/cities.plist" atomically:YES];
    /*
     ln = (dalian,shenyang)
     hb = (baoding,shijiazhuang)
     */

}

// 遍历数组
int main(int argc, const char * argv[]) {
    @autoreleasepool {

        //读取cities.plist
        NSDictionary *citiesDict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/fc/cities.plist"];

        [citiesDict enumerateKeysAndObjectsUsingBlock:^(id key, id  obj, BOOL *stop) {

            NSLog(@"key:%@, value:%@",key,obj); //obj是数组
        }];

    }
    return 0;
}

打印结果

 key:hb, value:(
    baoding,
    shijiazhuangn
)
  key:ln, value:(
    dalian,
    shenyang
)
        //读取cities.plist
        NSDictionary *citiesDict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/fc/cities.plist"];

        [citiesDict enumerateKeysAndObjectsUsingBlock:^(id key, id  obj, BOOL *stop) {

//            NSLog(@"key:%@, value:%@",key,obj);
            for (NSString *str in obj) {
                NSLog(@"city = %@",str);
            }
        // 获取每个数组 citiesDict[@"ln"];
        NSArray *arr = citiesDict[@"ln"];
        NSLog(@"arr = %@",[arr lastObject]);
        }];

打印结果

 city = baoding
 city = shijiazhuangn
 city = dalian
 city = shenyang

 arr = shenyang

NSMutableDictionary 常用方法

- (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey;
//添加一个键值对
- (void)removeObjectForKey:(id)aKey:
//通过aKey删除对应的value
- (void)removeAllObjects;
//删除所有键值对

[dict setObject:@"Jack" forKey:@"name"];
//现在
dict[@"name"] = @"Jack";
        //1)可变字典的创建
        NSMutableDictionary *dict1 = [NSMutableDictionary dictionary]; //创建空字典
        NSMutableDictionary *dict2 = [NSMutableDictionary dictionaryWithCapacity:3];

        //2)给可变字典添加键值对
        [dict1 setValue:@"lisi" forKey:@"ls"];  //键值key重复,lisi添加失败
        [dict1 setValue:@"zhaosi" forKey:@"ls"];

        [dict1 setValue:@"liuneng" forKey:@"ln"];
        NSLog(@"%@",dict1);

        //3)删除
        [dict1 removeObjectForKey:@"ls"];
        NSLog(@"%@",dict1);

        [dict1 removeAllObjects];
        NSLog(@"%@",dict1);

打印结果

NS系列[1344:45729] {
    ln = liuneng;
    ls = zhaosi;
}
NS系列[1344:45729] {
    ln = liuneng;
}
NS系列[1344:45729] {
}
        //4)修改
        [dict1 setObject:@"lisi" forKey:@"ls"];
        // 简写形式
        dict1[@"ls"] = @"xxxxx";
        NSLog(@"%@",dict1);

        //5)查找
        // [dict1 allKeys]; allKeys返回值为NSArray
        NSArray *arr = [dict1 allKeys];
        if ([arr containsObject:@"ls"]) {
            NSLog(@"存在ls的key");
        }

打印结果

NS系列[1488:50013] {
    ln = liuneng;
    ls = xxxxx;
}
NS系列[1488:50013] 存在ls的key

NSDictionary和NSArray 对比

*NSArray 是有序的,NSDictionary是无序的
*NSArray 是通过下标访问元素,NSDictionary是通过key访问元素

NSAray 的用法

// 创建
@[@"Jack", @"Rose"] (返回值是不可变数组)
// 访问
id d = array[1]
// 赋值
array[1] = @"jack"

NSDictionary 的用法

// 创建
@{@"name":@"Jack",@"phone":@"10086"} (返回是不可变字典)
// 访问
id d = dict[@"name"]
// 赋值
dict[@"name"] = @"jack"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值