OC NSArray(NSMutableArray)&NSDictionary(NSMutableDictionary)

696 阅读4分钟

NSArray

  • 只能存放任意OC对象, 并且是有顺序的

  • 它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素

  • NSArray使用NSLog()输出内容,内容是小括号的格式。

  • NSArray中不能存储nil,因为NSArray认为nil是数组的结束(nil是数组元素结束的标记)。nil就是0。0也是基本数据类型,不能存放到NSArray中。

    NSArray *arr = [NSArray arrayWithObjects:@"lnj", nil ,@"lmj",@"jjj", nil];
    NSLog(@"%@", arr);
    输出结果:
(
    lnj
)
  • 创建NSArray *arr1 = @[@"lnj", @"lmj", @"jjj",];

  • 访问 array[0];

NSArray给所有元素发消息

  • 让集合里面的所有元素都执行aSelector这个方法

    • - (void)makeObjectsPerformSelector:(SEL)aSelector;
    • - (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument;
    // 让数组中所有对象执行这个方法
    // 注意: 如果数组中的对象没有这个方法会报错
//    [arr makeObjectsPerformSelector:@selector(say)];
    [arr makeObjectsPerformSelector:@selector(eat:) withObject:@"bread"];

NSArray排序

  • Foundation自带类排序
NSArray *arr = @[@(1), @(9), @(5), @(2)];
NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
  • 自定义类排序
    NSArray *arr = @[p1, p2, p3, p4, p5];
    //    默认按照升序排序
    NSArray *newArr = [arr sortedArrayWithOptions:NSSortConcurrent usingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
    // 每次调用该block都会取出数组中的两个元素给我们
        return obj1.age > obj2.age;
    }];
    NSLog(@"%@", newArr);

NSArray 与字符串

把数组元素链接成字符串

  • - (NSString  )componentsJoinedByString:(NSString )separator;

    • 这是NSArray的方法, 用separator作拼接符将数组元素拼接成一个字符串
    NSArray *arr = @[@"lnj", @"lmj", @"jjj", @"xcq"];
    NSString *res = [arr componentsJoinedByString:@"*"];
    NSLog(@"res = %@", res);
输出结果:
lnj*lmj*jjj*xcq

字符串分割方法

  • - (NSArray  )componentsSeparatedByString:(NSString )separator;

    • 这是NSString的方法,将字符串用separator作为分隔符切割成数组元素
    NSString *str = @"lnj-lmj-jjj-xcq";
    NSArray *arr = [str componentsSeparatedByString:@"-"];
    NSLog(@"%@", arr);

输出结果:
(
    lnj,
    lmj,
    jjj,
    xcq
)

NSMutableArray

  • NSMutableArray是可变的,随时可以往里面添加\更改\删除元素

  • 不可以使用@[]创建可变数组

NSMutableArray *array = @[@"lnj", @"lmj", @"jjj"];
// 报错, 本质还是不可变数组
[array addObject:@“Peter”];

NSDictionary

  • NSDictionary的作用类似:通过一个key,就能找到对应的value
  • NSDictionary是不可变的, 一旦初始化完毕, 里面的内容就无法修改
  • NSDictionary创建简写:

NSDictionary *dict = @{@"name":@"lnj", @"phone":@"12345678", @"address":@"天朝"};

  • NSDictionary获取元素简写 dict[@"name”];
  • 字典存储的时候,必须是"键值对"的方式来存储(同时键不要重复)
  • 键值对中存储的数据是"无序的".

NSMutableDictionary

  • NSMutableDictionary是可变的,随时可以往里面添加\更改\删除元素
  • 设置键值对 dict[@"name"] = @"Jack";
  • 如果是不可变数组, 那么key不能相同

  如果是不可变字典出现了同名的key, 那么后面的key对应的值不会被保存

  如果是在可变数组中, 后面的会覆盖前面的

NSArray和NSDictionary的区别

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

NSNumber

  • NSArray\NSDictionary中只能存放OC对象,不能存放int\float\double等基本数据类
  • 如果真想把基本数据(比如int)放进数组或字典中,需要先将基本数据类型包装成OC对象
  • NSNumber可以将基本数据类型包装成对象,这样就可以间接将基本数据类型存进NSArray\NSDictionary中
  • // 注意: 如果传入的是变量那么必须在@后面写上(), 如果传入的常量, 那么@后面的()可以省略
    @10;
    @10.5;
    @YES;
    @(num);
    
    - (char)charValue;
    - (int)intValue;
    - (long)longValue;
    - (double)doubleValue;
    - (BOOL)boolValue;
    - (NSString *)stringValue;
    
        // 1.将基本数据类型转换为对象类型
        NSNumber *ageN = [NSNumber numberWithInt:age];
        NSNumber *numberN = [NSNumber numberWithDouble:number];
        NSNumber *valueN = [NSNumber numberWithInt:value];
    

NSValue

  • NSNumber是NSValue的子类, 但NSNumber只能包装数字类型

  • NSValue可以包装任意值

    • 因此, 可以用NSValue将结构体包装后,加入NSArray\NSDictionary中

常见结构体的包装

  • 为了方便 结构体 和NSValue的转换,Foundation提供了以下方法
  • 将结构体包装成NSValue对象
+ (NSValue *)valueWithPoint:(NSPoint)point;
+ (NSValue *)valueWithSize:(NSSize)size;
+ (NSValue *)valueWithRect:(NSRect)rect;

CGPoint point = NSMakePoint(10, 20);
NSValue *value = [NSValue valueWithPoint:point];
NSArray *arr = @[value];
  • 从NSValue对象取出之前包装的结构体
- (NSPoint)pointValue;
- (NSSize)sizeValue;
- (NSRect)rectValue;

任意数据的包装

  • NSValue提供了下列方法来包装任意数据
typedef struct{
        int age;
        char *name;
        double height;
    }Person;

    Person p = {30, "lnj", 1.75};
    // valueWithBytes: 接收一个指针, 需要传递需要包装的结构体的变量的地址
    // objCType: 需要传递需要包装的数据类型
    NSValue *pValue = [NSValue valueWithBytes:&p objCType:@encode(Person)];
    NSArray *arr = @[pValue];
    NSLog(@"%@", arr);
    // 从NSValue中取出自定义的结构体变量
    Person res;
    [pValue getValue:&res];
    NSLog(@"age = %i, name = %s, height = %f", res.age, res.name, res.height);