NSArray & NSDictionary

一、NSArray

1.1 简单创建方法由难到简

    NSArray *arr = [[NSArray alloc] init];
    NSArray *arr = [NSArray arrayWithObject:@"zcc"];
//    数组中的nil是结束符
    NSArray *arr = [NSArray arrayWithObjects:@"zcc", @"zgc" ,@"jjj", @"cp", nil]
    NSArray *arr = @[@"xcc", @"zcc", @"zgc"];
    // 但是注意 @[@"xcc", @"zcc", @"zgc"]; 这种方法创建出来的是immutable类型的,不能赋值给mutable,也就是说如下代码是不对的
    NSMutableArray *arrM =  @[@"xcc", @"zcc", @"zgc"];  //错误X

1.2 NSArray 只能用来存放OC的对象类型,对于int double 等这种基本数据类型是不支持的,需要将他们转为相应的OC对象才行。

错误:

    int age = 10;
    double number= 5.1;
    int value =  6;
    NSArray *arr =  @[age, number, value];

正确:将基本数据类型转换为对象类型

    // 1.将基本数据类型转换为对象类型
    NSNumber *ageN = [NSNumber numberWithInt:age];
    NSNumber *numberN = [NSNumber numberWithDouble:number];
    NSNumber *valueN = [NSNumber numberWithInt:value];

    NSArray *arr = @[ageN, numberN, valueN];
    NSLog(@"arr = %@", arr);

    // 2.将对象类型转换为基本数据类型
//    int temp = [ageN intValue];
//    double temp = [numberN doubleValue];
//    NSLog(@"%f", temp);

    // 3.基本数据类型转换对象类型简写
    // 注意: 如果传入的是变量那么必须在@后面写上(), 如果传入的常量, 那么@后面的()可以省略
//   NSNumber *temp = @(number);
      NSNumber *temp  [email protected]10.10;

1.3 数组的遍历

除了常规的for循环外  还可以使用block来遍历

// 使用OC数组的迭代器来遍历
    // 每取出一个元素就会调用一次block
    // 每次调用block都会将当前取出的元素和元素对应的索引传递给我们
    // obj就是当前取出的元素, idx就是当前元素对应的索引
    // stop用于控制什么时候停止遍历
    [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if (idx == 1) {
            *stop = YES;
        }
        NSLog(@"obj = %@, idx = %lu", obj, idx);
    }];

如果该数组中存放的自定义的Person对象,并且该类中又 - (void)say; - (void)sayWithName:(NSString *)name;两个方法(一个有参数,一个无参数),可以用该block方法来使对象执行方法

    Person *p1 = [Person new];
    Person *p2 = [Person new];
    Person *p3 = [Person new];
    Person *p4 = [Person new];

    NSArray *arr = @[p1, p2, p3, p4];
    /*
    [arr enumerateObjectsUsingBlock:^(Person *obj, NSUInteger idx, BOOL *stop) {
        [obj say];
    }];
    */

    // 如果使用OC数组存储对象, 可以调用OC数组的方法让数组中所有的元素都执行指定的方法
    // 注意点: 如果数组中保存的不是相同类型的数据, 并且没有相同的方法, 那么会报错
//    [arr makeObjectsPerformSelector:@selector(say)];

    // withObject: 需要传递给调用方法的参数,但是好像只能传一个参数
    [arr makeObjectsPerformSelector:@selector(sayWithName:) withObject:@"zcc"];

1.4 排序

上代码:

    NSArray *arr = @[@10, @20, @5, @7, @15];
    // 注意: 想使用compare方法对数组中的元素进行排序, 那么数组中的元素必须是Foundation框架中的对象, 也就是说不能是自定义对象
    // 默认是升序
    NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"排序后: %@", newArr);  // 5 7 10 15 20

对自定义对象的排序

Person *p1 = [Person new];
    p1.age = 10;

    Person *p2 = [Person new];
    p2.age = 20;

    Person *p3 = [Person new];
    p3.age = 5;

    Person *p4 = [Person new];
    p4.age = 7;

    NSArray *arr = @[p1, p2, p3, p4];
    NSLog(@"排序前: %@", arr);
    // 按照人的年龄进行排序
    // 不能使用compare:方法对自定义对象进行排序
//    NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];

    // 该方法默认会按照升序排序
    NSArray *newArr = [arr sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
        // 每次调用该block都会取出数组中的两个元素给我们
        // 二分
//        NSLog(@"obj1 = %@, obj2 = %@", obj1, obj2);
        return obj1.age > obj2.age;
//        return obj1.age < obj2.age;
        /*
        if (obj1.age > obj2.age) {
            // 5 4
            return NSOrderedDescending;
        }else if(obj1.age < obj2.age)
        {
            // 4 5
            return NSOrderedAscending;
        }else
        {
            return NSOrderedSame;
        }
         */
    }];
    NSLog(@"排序后: %@", newArr);  // age = 5, age = 7, age = 10, age = 20 

1.5 写入文件

    NSArray *arr = @[@"lnj", @"lmj", @"jjj"];
    // 其实如果将一个数组写入到文件中之后, 本质是写入了一个XML文件
    // 在iOS开发中一般情况下我们会将XML文件的扩展名保存为plist
    BOOL flag = [arr writeToFile:@"/Users/xiaomage/Desktop/abc.plist" atomically:YES];
    NSLog(@"flag = %i", flag);
    // 如果想要将自定义对象写入的话不能用这个方法,得用NSKeyedArchiver, 并且对象得遵守NSCoding协议,并且相应的实现协议中的两个方法。
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;

1.6 NSMutableArray

可变的Array,可以不在初始化的时候赋值。

 // 创建一个空的数组
    NSMutableArray *arrM = [NSMutableArray array];
    NSLog(@"%@", arrM);
    // 如何添加
    [arrM addObject:@"lnj"];
    // 将指定数组中的元素都取出来, 放到arrM中
    // 并不是将整个数组作为一个元素添加到arrM中
    [arrM addObjectsFromArray:@[@"lmj", @"jjj"]];
    // 注意: 以下是将整个数组作为一个元素添加
//    [arrM addObject:@[@"lmj", @"jjj"]];
    NSLog(@"%@", arrM);
    // 如何插入
    [arrM insertObject:@"xcq" atIndex:1];
    NSLog(@"%@", arrM);

    NSRange range = NSMakeRange(2, 2);
    NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:range];
    // 插入一组数据, 指定数组需要插入的位置, 和插入多少个
    [arrM insertObjects:@[@"A", @"B"] atIndexes:set];
     NSLog(@"%@", arrM);

    // 如何删除
    [arrM removeObjectAtIndex:0];
     NSLog(@"%@", arrM);

    [arrM removeLastObject];
    NSLog(@"%@", arrM);

    [arrM removeObject:@"A"];
     NSLog(@"%@", arrM);

    // 如何替换
    [arrM replaceObjectAtIndex:1 withObject:@"M"];
    NSLog(@"%@", arrM);

    // 如何获取
    NSLog(@"%@", [arrM objectAtIndex:0]);
    NSLog(@"%@", arrM[0]);

    // 替换
    arrM[0] = @"ZS";
    NSLog(@"%@", arrM);

    // 注意: 不能通过@[]来创建一个可变数组, 因为@[]创建出来的是一个不可变的数组
    // 如果把一个不可变数组当做一个可变数组来使用, 会引发一个运行时的错误
    NSMutableArray *arrM = @[@"lnj", @"lmj"];
    [arrM addObject:@"JJJ"];

2.NSDictionary

总结的大体思路和NSArray类似就全部都写出来了

    // 1.如何创建
    NSDictionary *dict = [NSDictionary dictionaryWithObject:@"lnj" forKey:@"name"];
    NSString *name = [dict objectForKey:@"name"];
    NSLog(@"name = %@", name);

    // 注意: key和value 是一一对应
    NSDictionary *dict = [NSDictionary dictionaryWithObjects:@[@"lnj", @"30", @"1.75"] forKeys:@[@"name", @"age", @"height"]];
    NSLog(@"%@ %@ %@", [dict objectForKey:@"name"], [dict objectForKey:@"age"], [dict objectForKey:@"height"]);
    // 推荐这个  简单很多
    NSDictionary *dict = @{key:value};
    NSDictionary *dict = @{@"name": @"lnj"};
    NSLog(@"%@", dict[@"name"]);

    NSDictionary *dict = @{@"name":@"lnj", @"age":@"30", @"height":@"1.75"};
    NSLog(@"%@ %@ %@", dict[@"name"], dict[@"age"], dict[@"height"]);

    // 2.字典的遍历
    NSDictionary *dict = @{@"name":@"lnj", @"age":@"30", @"height":@"1.75"};
     2.1如何获取字典中key和value的个数, 在字典中key称之为键, value称之为值
    NSLog(@"count = %lu", [dict count]);

    /*
    for (int i = 0; i < dict.count; ++i) {
        // 获取字典中所有的key
        NSArray *keys = [dict allKeys];
        // 取出当前位置对应的key
//        NSLog(@"%@", keys[i]);
        NSString *key = keys[i];
        NSString *value = dict[key];
        NSLog(@"key = %@, value = %@", key, value);
    }
     */

    /*
    // 如何通过forin遍历字典, 会将所有的key赋值给前面的obj
    for (NSString *key in dict) {
        NSString *value = dict[key];
        NSLog(@"key = %@, value = %@", key, value);

    }
     */

    /*
    [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"key = %@, value = %@", key, obj);
    }];
     */

    // 3.字典文件读写
    NSDictionary *dict = @{@"name":@"lnj", @"age":@"30", @"height":@"1.75"};
    // XML 扩展名plist
    [dict writeToFile:@"/Users/xianren/Desktop/info.plist" atomically:YES];

    // 注意: 字典和数组不同, 字典中保存的数据是无序的
    NSDictionary *newDict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/xianren/Desktop/info.plist"];
    NSLog(@"%@", newDict);

    NSArray *arr = @[@10, @20, @30, @5];
    [arr writeToFile:@"/Users/xianren/Desktop/abc.plist" atomically:YES];

NSMutableDictionary

// 1.创建一个空的字典
    NSMutableDictionary *dictM = [NSMutableDictionary  dictionary];
    NSLog(@"%@", dictM);
    // 2.如何添加
    [dictM setObject:@"lnj" forKey:@"name"];
    NSLog(@"%@", dictM);
    // 会将传入字典中所有的键值对取出来添加到dictM中
    [dictM setValuesForKeysWithDictionary:@{@"age":@"30", @"height":@"1.75"}];
    NSLog(@"%@", dictM);
    // 3.如何获取
    NSLog(@"name = %@", dictM[@"name"]);

    // 4.如何删除
    [dictM removeObjectForKey:@"name"];
    NSLog(@"%@", dictM);
//    [dictM removeObjectsForKeys:@[@"age", @"height"]];
//     NSLog(@"%@", dictM);
    // 5.如何修改
    // 如果利用setObject方法给同名的key赋值, 那么新值会覆盖旧值
//    [dictM setObject:@"88" forKey:@"age"];
     dictM[@"age"] = @"88";
    NSLog(@"%@", dictM);

    // 1.不能使用@{}来创建一个可变的字典
    NSMutableDictionary *dictM = @{@"name":@"lnj"};
    [dictM setObject:@"30" forKey:@"age"];

    // 2.如果是不可变数组, 那么key不能相同
    // 如果是不可变字典出现了同名的key, 那么后面的key对应的值不会被保存
    // 如果是在可变数组中, 后面的会覆盖前面的
    NSDictionary *dict = @{@"name":@"lmj", @"name":@"lnj"};
    NSLog(@"dict = %@", dict);

    NSMutableDictionary *dictM = [NSMutableDictionary dictionaryWithObjects:@[@"lmj", @"lnj"] forKeys:@[@"name", @"name"]];
    NSLog(@"dict = %@", dictM);
时间: 2024-11-01 16:43:27

NSArray & NSDictionary的相关文章

Xcode4.4(LLVM4.0编译器)中NSArray, NSDictionary, NSNumber优化写法

Xcode4.4(LLVM4.0编译器)中NSArray, NSDictionary, NSNumber优化写法 从xcode4.4开始,LLVM4.0编译器为Objective-C添加一些新的特性.创建数组NSArray,字典NSDictionary, 数值对象NSNumber时,可以像NSString的初始化一样简单方便.妈妈再也不担心程序写得手发酸了. A.   NSArray 首先是非常常用的NSArray,NSMutableArray.NSArray是一个初始化后就固定的静态数组.如果

NSData NSDate NSString NSArray NSDictionary 相互转化

//    NSData  NSDate NSString NSArray NSDictionary json NSString *string = @"hello word"; NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",nil

oc/object-c/ios哪种遍历NSArray/NSDictionary方式快?测试报告

做app的时候,总免不了要多次遍历数组或者字典.究竟哪种遍历方式比较快呢?我做了如下测试:首先定义测试用宏: ? 1 2 3 4 5 6 7 8 9 #define MULogTimeintervalBegin(INFO) NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];\ NSTimeInterval duration = 0;\ NSLog(@"MULogTimeintervalBegin:%@", IN

Read and Write NSArray, NSDictionary and NSSet to a File

查询地址:http://iosdevelopertips.com/data-file-management/read-and-write-nsarray-nsdictionary-and-nsset-to-a-file.html With just a few lines of code, you can read/write collections to/from files. The code below shows examples for writing and reading both

[转]一些NSArray,NSDictionary,NSSet相关的算法知识

iOS编程当中的几个集合类:NSArray,NSDictionary,NSSet以及对应的Mutable版本,应该所有人都用过.只是简单使用的话,相信没人会用错,但要做到高效(时间复杂度)精确(业务准确性),还需要了解其中所隐藏的算法知识. 在项目当中使用集合类几乎是不可避免的,集合类的使用场景其实可以进行抽象的归类.大多数时候我们需要将若干个对象(object)暂时保存起来,以备后续的业务逻辑进行操作,「保存和操作」,或者说「存与取」,对应到计算机世界的术语就是读和写.最初保存的时候我们Ins

NSArray / NSDictionary 转 Json

在iOS开发中,网络数据转换是必不可少的,我们时常会用到NSArray / NSDictionary转化成Json字符串. 网上看到很多都是借助于第三方去转化,就个人而言,我认为三方的东西一方面增加了冗余度,另一方面时常更新,比较头疼. 仔细看看了苹果自带的json序列化解析器,苹果提供了字典和数组转化Json字符串的方法. NSDictionary * dict = [[NSDictionary alloc]initWithObjectsAndKeys:@"张三",@"na

NSData NSDate NSString NSArray NSDictionary 相互转换

// NSData NSDate NSString NSArray NSDictionary json NSString *string = @"hello word"; NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",nil]; N

iOS - 数组与字典(NSArray &amp; NSDictionary)

1. 数组的常用处理方式 //--------------------不可变数组 //1.数组的创建 NSString *s1 = @"zhangsan"; NSString *s2 = @"lisi"; NSString *s3 = @"wangwu"; //(1) NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil]; NSLog(@"%@",a

遍历NSArray, NSDictionary, NSSet的方法总结

1,for循环读取 1 NSArray: 2 NSArray *array = /*…*/ 3 for(int i=0; i<array.count; i++) 4 { 5 id object = array[i]; 6 // do sth 7 } 8 9 NSDictionary: 10 NSDictionary *dic = /*…*/ 11 NSArray *keys = [dic allKeys]; 12 for(int i=0; i<keys.count; i++) 13 { 14

Fouandation(NSString ,NSArray,NSDictionary,NSSet) 中常见的理解错误区

Fouandation 中常见的理解错误区 1.NSString //快速创建(实例和类方法) 存放的地址是 常量区 NSString * string1 = [NSString alloc]initWithString:@“123”]; NSString * string3 = [NSString stringWithString:@“123”]; //格式化方法创建   存放地址是堆区 NSString * string2 = [NSString alloc]initWithFormat:@