一、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 = ;
double number= 5.1;
int value = ;
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 =@10.10;

1.3 数组的遍历

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

// 使用OC数组的迭代器来遍历
// 每取出一个元素就会调用一次block
// 每次调用block都会将当前取出的元素和元素对应的索引传递给我们
// obj就是当前取出的元素, idx就是当前元素对应的索引
// stop用于控制什么时候停止遍历
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if (idx == ) {
*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 = @[@, @, @, @, @];
// 注意: 想使用compare方法对数组中的元素进行排序, 那么数组中的元素必须是Foundation框架中的对象, 也就是说不能是自定义对象
// 默认是升序
NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"排序后: %@", newArr); // 5 7 10 15 20

对自定义对象的排序

Person *p1 = [Person new];
p1.age = ; Person *p2 = [Person new];
p2.age = ; Person *p3 = [Person new];
p3.age = ; Person *p4 = [Person new];
p4.age = ; 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:];
NSLog(@"%@", arrM); NSRange range = NSMakeRange(, );
NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:range];
// 插入一组数据, 指定数组需要插入的位置, 和插入多少个
[arrM insertObjects:@[@"A", @"B"] atIndexes:set];
NSLog(@"%@", arrM); // 如何删除
[arrM removeObjectAtIndex:];
NSLog(@"%@", arrM); [arrM removeLastObject];
NSLog(@"%@", arrM); [arrM removeObject:@"A"];
NSLog(@"%@", arrM); // 如何替换
[arrM replaceObjectAtIndex: withObject:@"M"];
NSLog(@"%@", arrM); // 如何获取
NSLog(@"%@", [arrM objectAtIndex:]);
NSLog(@"%@", arrM[]); // 替换
arrM[] = @"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", @"", @"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":@"", @"height":@"1.75"};
NSLog(@"%@ %@ %@", dict[@"name"], dict[@"age"], dict[@"height"]); // 2.字典的遍历
NSDictionary *dict = @{@"name":@"lnj", @"age":@"", @"height":@"1.75"};
.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":@"", @"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 = @[@, @, @, @];
[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":@"", @"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"] = @"";
NSLog(@"%@", dictM); // 1.不能使用@{}来创建一个可变的字典
NSMutableDictionary *dictM = @{@"name":@"lnj"};
[dictM setObject:@"" 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);

NSArray & NSDictionary的更多相关文章

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

    iOS编程当中的几个集合类:NSArray,NSDictionary,NSSet以及对应的Mutable版本,应该所有人都用过.只是简单使用的话,相信没人会用错,但要做到高效(时间复杂度)精确(业务准 ...

  2. NSData NSDate NSString NSArray NSDictionary 相互转换

    // NSData NSDate NSString NSArray NSDictionary json NSString *string = @"hello word"; NSDa ...

  3. Read and Write NSArray, NSDictionary and NSSet to a File

    查询地址:http://iosdevelopertips.com/data-file-management/read-and-write-nsarray-nsdictionary-and-nsset- ...

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

    Xcode4.4(LLVM4.0编译器)中NSArray, NSDictionary, NSNumber优化写法 从xcode4.4开始,LLVM4.0编译器为Objective-C添加一些新的特性. ...

  5. NSData NSDate NSString NSArray NSDictionary 相互转化

    //    NSData  NSDate NSString NSArray NSDictionary json NSString *string = @"hello word"; ...

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

    Fouandation 中常见的理解错误区 1.NSString //快速创建(实例和类方法) 存放的地址是 常量区 NSString * string1 = [NSString alloc]init ...

  7. 一些NSArray,NSDictionary,NSSet相关的算法知识

    iOS编程当中的几个集合类:NSArray,NSDictionary,NSSet以及对应的Mutable版本,应该所有人都用过.只是简单使用的话,相信没人会用错,但要做到高效(时间复杂度)精确(业务准 ...

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

    1,for循环读取 NSArray: NSArray *array = /*…*/ ; i<array.count; i++) { id object = array[i]; // do sth ...

  9. iOS - 数组与字典(NSArray & NSDictionary)

    1. 数组的常用处理方式 //--------------------不可变数组 //1.数组的创建 NSString *s1 = @"zhangsan"; NSString *s ...

  10. [翻译] 用 ObjectiveSugar 扩展NSArray NSDictionary NSSet NSNumber

    source - https://github.com/supermarin/ObjectiveSugar Look like a girl, act like a lady, think like ...

随机推荐

  1. laravel的model例子

    5里面直接artisan建立model ./artisan make:model MyModel 找到MyModel,改成下面这样 <?php namespace App; use Illumi ...

  2. "==" 与 “equals”

    “==”: “==”或等号操作在Java编程语言中是一个二元操作符,用于比较原生类型和对象.(操作符不支持重载overloading) “==”对比两个对象基于内存引用,如果两个对象的引用完全相同(指 ...

  3. jmetr _MD5加密_获取签名

    要达到的目的: app每个请求里面 请求头都带有一个 sign 的参数, 他的值是通过 开发自己设计的拼接方式 再通过md5加密生成 我们就是要生成这个sign的值出来 准备: 和开发要到签名组成公式 ...

  4. java代码-----实现4个人打牌游戏的相关代码。线程

    总结:发送线程Sender().和接收线程Receiver() 虽然,这里的Sender()发送线程和Receiver()都有相同的睡眠时间,但是由于线程调度的不确定性,是的发送线程Sender每次发 ...

  5. IP 地址 与 DNS

    IP地址转化 192.168.10.1 十进制,点分十进制地址 32位二进制数字序列,四段,八位 十进制与二进制转换00000000 = 000000001 = 2 * 0 = 100000010 = ...

  6. ansible之感冒药

    Ansible简介安装 Ansible是一个综合的强大的管理工具,他可以对多台主机安装操作系统,并为这些主机安装不同的应用程序,也可以通知指挥这些主机完成不同的任务.查看多台主机的各种信息的状态等,a ...

  7. Understanding OpenStack Authentication: Keystone PKI

    The latest stable release of OpenStack, codenamed Grizzly, revolutionizes the way user authenticatio ...

  8. An Autofac Lifetime Primer

    Or, “Avoiding Memory Leaks in Managed Composition” Understanding lifetime can be pretty tough when y ...

  9. 查看Android内存,cpu

    转自https://testerhome.com/topics/2583 一.查看内存 查看Android应用内存: adb shell dumpsys meminfo 1.查看详细的内存: adb ...

  10. C 语言 - 逻辑运算和短路求值

    逻辑运算符: 运算符 含义 优先级 ! 逻辑非 高 && 逻辑与 中 || 逻辑或 低 举例: !a:如果 a 为真,!a 为假:如果 a 为 假,!a 为真 a && ...