Foundation => Objective-C _ Part6

1. Foundation简介

2. NSString

3. NSMutableString

4. category分类

  1. OC特有语法
  2. 作用
    • 可以在不修改原来类的基础上, 为这个类扩充了一些方法
    • 一个庞大的类可以分模块开发 ==> 最大的用途之一
    • 一个庞大的类可以由多个人来编写, 更利于团队合作 =>Foundation 就是这么写的
  3. 使用
    • 分类也分为声明和实现2个部分
    • 创建: OCFILE => File: 分类的名称 => FileType: Category =>Class: 给谁扩充方法

5. NSArray

  1. 数组的创建
    • 简写形式NSArray *array = @[@"111", @"222"];
    • 创建空数组[NSArray array] \ [[NSArray alloc]init]
  2. 输出的特征 - - - 以( 数组内容 )形式展示
  3. 特性:OC数组, 可以存不同的数据类型
  4. 常用方法介绍
    • 获得下标为?的内容 [arr objectAtIndex: ?]
      • 简写形式 - - - arr[?]
    • 判断是否包含某个元素 [arr containsObjects:@"111"] 返回BOOL值
  5. 数组遍历
    • 常规遍历, 就是int i = 0 这种
    • 增强for循环遍历 for in
      • for(NSObject *obj in array)
      • 逐个取出array中的元素, 将取出的元素赋值给obj
      • 注意: obj的类型可以根据数组中的元素类型来写, 不一定要写NSObject, 通常是数组元素是什么类型, 就定义什么类型
    • OC数组迭代器遍历 - - - 推荐这种方法
      [array enumerateObjectsUsingBlock:^(id obj,NSUinteger idx, BOOL *stop)];
      • 每取出一个元素, 就会调用疑似Block
      • 每次调用Block都会将当前取出的元素和元素对应的索引传递给我们
      • obj就是当前取出的元素
      • idx就是当前元素对应的索引
      • stop用于控制什么时候停止遍历
  6. 让NSArray中所有对象执行方法
    • 如果使用 OC 数组存储对象, 就可以调用 OC 数组的方法 : 让数组中所有的元素都执行指定的方法
    • 注意: 如果数组中保存的不是相同类型的数据, 并且没有相同的方法, 就会报错
      • [array makeObjectsPerformSelector:@selector(方法名)];
    • 这个方法可以带且仅能带一个参数, 需要多个参数, 就需要用遍历来做
    • withObject: 需要传递给调用方法的参数
      • [array makeObjectsPerformSelector:@selector(方法名) withObject: @"参数"];
  7. 数组排列
    • 注意: 使用 compare 方法对数组元素进行排序. 数组元素必须是 Foundation 框架中的对象, 不能是自定义对象
      • NSArray *newArr = [array sortedArrayUsingSelector:@selector(方法名)];
      • newArr是排序后的新数组, 因为array是不可变的数组
    • 自定义对象的排序, 需要明确指出排序的规则
      • [array sortedArrayWithOptions: NSSortStable usingComparator: ^NSComparisonResult(id obj1, id obj2){ 内容 }];
      • 该方法默认按升序排序
      • 每次调用 block, 都会取出数组中的2个元素
      • 这个 block 需要返回值. 可以 return obj1.属性名 > obj2.属性名
  8. NSArray和NSString转换
    • 通过数组生成字符串NSString * str = [array componentsJoinedByString:@“-”];
    • 通过字符串, 生成数组,也叫字符串切割NSArray * array = [str componentsSeparatedByString:@“-”];
  9. NSArray文件读写
    • 文件写入 BOOL 变量名 = [array writeToFile:@"路径字符串"atomically: YES];
    • 文件读取NSArray *newArr = [NSArray arrayWithContentsOfFile:@"路径字符串"];
    • 写入自定义的对象 - - - writeToFile只能写入Foundation框架的对象类型, 自定义的不能写入

6. NSMutableArray

  • 如何添加元素
[arM addObject:@“111”];   ===>  添加一个元素
[arrM addObjectsFromArray: @[@“QQ”,@“DING”]];  ====>  将数组中所有元素取出, 加入到 arrM 中
  • 如何插入元素
//插入1个元素
[arrM insertObject:@“ZZZ” atIndex: 10];
//插入一组数据, 指定数组需要插入的位置, 和插入多少个
[arrM insertObjects:@[@“AAA”,@“BBB”] atIndexs:(NSIndexSet *)];
  • 如何删除元素
[arrM removeObjectAtIndex: 0];
[arrM removeObject: @“AAA”];
[arrM removeLastObject];
  • 如何替换元素
[arrM replaceObjectAtIndex: 10 withObject:@“MMM”];
arrM[10] = @“MMM”; ==>简写
  • 如何获得
[arrM objectAtIndex:0];
arrM[0] ===> 简写
  • 注意: 不能通过@[] 创建可变数组. 因为它创建的时不可变数组( NSArray );
  • 如果把NSArray 当作 NSMutableArray 用, 会引发一个运行时错误

7. NSDictionary

  1. 字典的创建和取值
    • 简单创建方式 @{@“key 名”:@“value 值”, …}
    • 简单获得方式 dict[@“key名”]
  2. 字典的遍历
    • 如何获取字典中键值对的个数 NSLog(@“count = %lu”,[dict count]);
    • 如何遍历
      • 普通for 循环 NSArray *keys = [dict allKeys];
      • 增强 for 循环for(NSString *key in dict)
      • 迭代器 ==> 直接传 key 和 value . ==>> 这个最简单,最好用
  3. 字典的文件读写
    • 写入文件 [dict writeToFile:@“路径” atomically: YES] ;
    • 读出文件 NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:@“路径”];
    • 注意 : 字典是无序的

8. NSMutableDictionary

  • 创建
    NSMutableDictionary *dictM = [NSMutableDictionary dictionary];
  • 添加
[dictM setObject:@“value” forKey:@“key”];
dictM[@“newKey”] = @“9999”
[dictM setValuesForKeysWithDictionary:@{自定义的字典}]; ==>>会将传入字典中所有的键值对取出来添加到 dictM 中
  • 获取
    NSLog(@“name = %@”,dictM[@“name”])
  • 删除
    [dictM removeObjectForKey:@“name”];
  • 修改
    [dictM setObject:@“888” forKey:@“key”];
  • 注意点
    • 不能用@{} 创建可变字典
    • 如果是NSDictionary, 那么 Key 不能相同
    • 如果是在 NSDictionary 中出现了同名的 key, 那么后面的 key 对应的值不会被保存
    • 如果是在 NSMutableDictionary 中, 后面的会覆盖前面的

9. 常用结构体

NSPoint = CGPoint
NSSize = CGSize
NSRect = CGRect

10. NSNumber

  • 基本数据类型转换为对象类型
    • 普通写法 NSNumber *num = [NSNumber numberWithInt:age];
    • 简写 NSNumber *num = @(age);
    • 注意: 如果传入的是变量, 就必须写@(变量), 如果是常量, 可以写成@常量
  • 对象类型转换为基本数据类型
    • 普通写法 int temp = [ageN intValue];

11. NSValue

  • 用于包装任意类型 - - - 对象类型
CGPoint point = CGPointMake(10,20);
NSValue *value = [NSValue valueWithPoint:point];
NSArray *arr = @[value];
  • 包装自定义结构体
Person p = {30,”lnj”, 1.75};
NSValue *value = [NSValue valueWithBytes:&p  objCType:@encode(Person)];
Person res;  ==>>> 从 NSValue 中取出自定义的结构体变量
[pValue getValue:&res];

//valueWithBytes: 接收一个指针, 需要传递需要包装的结构体的变量的地址
//objCType 需要传递需要包装的数据类型

12. NSDate

  • 表示时间,进行时间和日期的处理
  • 创建和基本概念
NSDate *now = [NSDate date];          ==> 只要通过 date 方法创建的对象,  就已经保存了当前的时间
NSTimeZone *zone = [NSTimeZone systemTimeZone];  ===>>> 获取当前所处的时区
NSInteger seconds = [zone secondsFromGMTForDate: now]  ===>>> 获取当前时区和指定时间的时间差
NSDate *locationNow = [now dateByAddingTimeInterval: seconds]  ===>>>在 now 的基础上,追加时区之间的时间差,获得准确的当前时间
  • 时间输出的格式 NSDate ==>>> NSString
NSDate *now = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
formatter.dateformat = @“YYYY-MM-dd HH-mm-ss”;
NSString *res = [formatter stringFromDate: now];
  • NSString 转换为 NSDate
NSString *str = @“2015-12-15 08:02:03 +0000”;
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
formatter.dateFormat = @“yyyy-MM-dd HH:mm:ss Z”;  ==>>>注意: 从 NSString==>>NSDate, 那么 dateFormat 的格式必须和字符串中的时间格式一致.
NSDate *date = [formatter dateFromString : str];

13. NSCalendar

  • 获取当前时间的日历格式
NSDate *now = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];  
NSDateComponents *cmps =[calendar components:枚举类型的参数 fromDate: now];
//一般情况下如果一个方法接收一个参数, 这个参数是是一个枚举 , 那么可以通过|符号, 连接多个枚举值
NSCalendarUnit type = NSCalendarUnitYear |
                     NSCalendarUnitMonth |
                       NSCalendarUnitDay |
                      NSCalendarUnitHour |
                    NSCalendarUnitMinute |
                    NSCalendarUnitSecond;
  • 比较两个时间的时间差
    • 获取过去的时间
NSString *str = @"2015-06-29 07:05:26 +0000";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss Z";
NSDate *date = [formatter dateFromString:str];
  • 获取当前的时间 NSDate *now = [NSDate date];
  • 比较两个时间
NSCalendar *calendar = [NSCalendar currentCalendar];
NSCalendarUnit type = NSCalendarUnitYear |
                     NSCalendarUnitMonth |
                       NSCalendarUnitDay |
                      NSCalendarUnitHour |
                    NSCalendarUnitMinute |
                    NSCalendarUnitSecond;
NSDateComponents *cmps = [calendar components:type fromDate:date toDate:now options:0];
NSLog(@"%ld年%ld月%ld日%ld小时%ld分钟%ld秒钟", cmps.year, cmps.month, cmps.day, cmps.hour, cmps.minute, cmps.second);

14. NSFileManager

  1. 用来管理文件系统的
  2. 它是单例 NSFileManager *manager = [NSFileManager defaultManager];
  3. 判断文件是否存在, ==>>较为常用
  4. 是否是文件夹, ==>>较为常用
  5. 获取文件或文件夹的属性 ==>> 返回字典 ==>>包含了所有文件的属性
  6. 清除缓存 ==>>
  7. copy, delete, move
  8. 创建文件夹
  9. 是否可读,
  10. 是否可写,
  11. 是否可删除

你可能感兴趣的:(Objective-C,Foundation)