OC系列之Foundation框架

一 Foundation框架介绍

  • 框架是由许多类、方法、函数、文档按照一定的逻辑组织起来的集合。
  • Foundation框架中的类

    • Foundation框架允许使用一些基本对象,如数字和字符串,以及一些对象集合,如数组,字典和集合,其他功能包括处理日期和时间、内存管理、处理文件系统、存储(或归档)对象、处理几何数据结构(如点和长方形)
    • Foundation框架提供了非常多好用的类, 比如
      NSString : 字符串
      NSArray : 数组
      NSDictionary : 字典
      NSDate : 日期
      NSData : 数据
      NSNumber : 数字
      
  • Foundation框架常见错误

    • 有时候会在不经意之间修改了系统自带的头文件, 比如NSString.h, 这时会出现以下错误:

    • 解决方案很简单, 只需要删除Xcode的缓存即可

      • 缓存路径是/Users/用户名/Library/Developer/Xcode/DerivedData(默认情况下, 这是一个隐藏文件夹)
  • 要想看到上述文件夹, 必须在终端敲指令显示隐藏文件夹, 指令如下

    • 显示隐藏文件 : defaults write com.apple.finder AppleShowAllFiles –bool true
    • 隐藏隐藏文件 : defaults write com.apple.finder AppleShowAllFiles –bool false
    • (输入指令后, 一定要重新启动Finder)

二 NSString

  • 什么是NSString?

    • 一个NSString对象就代表一个字符串(文字内容)
    • 一般称NSString为字符串类
  • NSString创建方式

    • 最直接的方式(常量字符串)

      • 常量区中的字符串只要内容一致, 不会重复创建
        NSString *str1 = @"xxx";
        NSString *str3 = @"xxx";
        NSLog(@"str1 = %p, str3 = %p", str1, str3);
        输出地址一致
    • 格式化的方式

      • 堆区中得字符串哪怕内容一致, 也会重复创建
        NSString *str2 = [NSString stringWithFormat:@"xxx"];
        NSString *str4 = [NSString stringWithFormat:@"xxx"];
        NSLog(@"str2 = %p, str4 = %p", str2, str4);
        输出地址不一样

    字符串读写

  • 从文件中读取
// 用来保存错误信息
NSError *error = nil;

// 读取文件内容
NSString *str = [NSString stringWithContentsOfFile:@"/Users/guo/Desktop/xxx.txt" encoding:NSUTF8StringEncoding error:&error];
// 注意: 以后在OC方法中但凡看到XXXofFile的方法, 传递的一定是全路径(绝对路径)
// 如果有错误信息
if (error) {
    NSLog(@"读取失败, 错误原因是:%@", [error localizedDescription]);
} else { // 如果没有错误信息
    NSLog(@"读取成功, 文件内容是:\n%@", str);
}
  • 写入文件中
NSString *str = @"V5";
BOOL flag = [str writeToFile:@"/Users/guo/Desktop/xx.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
if (flag == 1)
{
    NSLog(@"写入成功");
}
  • 重复写入同一文件会覆盖掉上一次的内容

  • 什么是URL

    • URL的全称是Uniform Resource Locator(统一资源定位符)
    • URL是互联网上标准资源的地址
    • 互联网上的每个资源都有一个唯一的URL,它包含的信息指出资源的位置
    • 根据一个URL就能找到唯一的一个资源
  • URL的格式

    • 基本URL包含协议、主机域名(服务器名称\IP地址)、路径
    • 可以简单认为: URL == 协议头://主机域名/路径
  • 常见的URL协议头(URL类型)

    • http\https :超文本传输协议资源, 网络资源
    • ftp :文件传输协议
    • file :本地电脑的文件
  • URL的创建

    • 传入完整的字符串创建

      NSURL *url = [NSURL URLWithString:@"file:///Users/guo/Desktop/str.txt"];
    • 通过文件路径创建(默认就是file协议的)

      NSURL *url = [NSURL fileURLWithPath:@"/Users/guo/Desktop/str.txt"];
  • 使用NSURL读写字符串

    • 从URL中读取
    // 用来保存错误信息
    NSError *error = nil;
    
    // 创建URL路径
    //    NSString *path = @"file://192.168.199.119/Users/guo/Desktop/xx.txt";
    
    //  本机可以省略主机域名
    //    NSString *path = @"file:///Users/guo/Desktop/xx.txt";
    NSURL *url = [NSURL URLWithString:path];
    
    //  利用fileURLWithPath方法创建出来的URL默认协议头为file://
    NSURL *url = [NSURL fileURLWithPath:@"/Users/guo/Desktop/xx.txt"];
    
    // 读取文件内容
    NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
    
    // 如果有错误信息
    if (error) {
    NSLog(@"读取失败, 错误原因是:%@", [error localizedDescription]);
    } else { // 如果没有错误信息
    NSLog(@"读取成功, 文件内容是:\n%@", str);
    }
    • 写入URL中
    NSString *str = @"哥";
    [str writeToURL:[NSURL URLWithString:@"/Users/guo/Desktop/xx.txt"] atomically:YES encoding:NSUTF8StringEncoding error:nil];
    

字符串比较

  • NSString大小写处理

    • 全部字符转为大写字母

      • - (NSString *)uppercaseString;
    • 全部字符转为小写字母

      • - (NSString *)lowercaseString
    • 首字母变大写,其他字母都变小写

      • - (NSString *)capitalizedString
  • NSString比较方法:

  • - (BOOL)isEqualToString:(NSString *)aString;
    • 两个字符串的内容相同就返回YES, 否则返回NO
    NSString *str1 = @"xx";
    NSString *str2 = [NSString stringWithFormat:@"xx"];
    if ([str1 isEqualToString:str2]) {
        NSLog(@"字符串内容一样");
    }
    if (str1 == str2) {
        NSLog(@"字符串地址一样");
    }
  • - (NSComparisonResult)compare:(NSString *)string;
    • 这个方法可以用来比较两个字符串内容的大小
    • 比较方法: 逐个字符地进行比较ASCII值,返回NSComparisonResult作为比较结果
    • NSComparisonResult是一个枚举,有3个值:
      • 如果左侧 > 右侧,返回NSOrderedDescending,
      • 如果左侧 < 右侧,返回NSOrderedAscending,
      • 如果左侧 == 右侧返回NSOrderedSame
    NSString *str1 = @"abc";
    NSString *str2 = @"abd";
    switch ([str1 compare:str2]) {
        case NSOrderedAscending:
            NSLog(@"后面一个字符串大于前面一个");
            break;
        case NSOrderedDescending:
            NSLog(@"后面一个字符串小于前面一个");
            break;
        case NSOrderedSame:
            NSLog(@"两个字符串一样");
            break;
    }
    输出结果: 后面一个字符串大于前面一个
  • - (NSComparisonResult) caseInsensitiveCompare:(NSString *)string;
    • 忽略大小写进行比较,返回值与compare:一致
    NSString *str1 = @"abc";
    NSString *str2 = @"ABC";
    switch ([str1 caseInsensitiveCompare:str2]) {
        case NSOrderedAscending:
            NSLog(@"后面一个字符串大于前面一个");
            break;
        case NSOrderedDescending:
            NSLog(@"后面一个字符串小于前面一个");
            break;
        case NSOrderedSame:
            NSLog(@"两个字符串一样");
            break;
    }
    输出结果:两个字符串一样

字符串搜索

  • 字符串搜索

    • - (BOOL)hasPrefix:(NSString *)aString;

      • 是否以aString开头
    • - (BOOL)hasSuffix:(NSString *)aString;

      • 是否以aString结尾
    • - (NSRange)rangeOfString:(NSString *)aString;

      • 用来检查字符串内容中是否包含了aString
      • 如果包含, 就返回aString的范围
      • 如果不包含, NSRange的location为NSNotFound, length为0
  • NSRange基本概念

    • NSRange是Foundation框架中比较常用的结构体, 它的定义如下:
typedef struct _NSRange {
    NSUInteger location;
    NSUInteger length;
} NSRange;
// NSUInteger的定义
typedef unsigned int NSUInteger;
  • NSRange用来表示事物的一个范围,通常是字符串里的字符范围或者数组里的元素范围

  • NSRange有2个成员

    • NSUInteger location : 表示该范围的起始位置
    • NSUInteger length : 表示该范围内的长度

比如@“I love XXX”中的@“XXX”可以用location为7,length为3的范围来表示

  • NSRange的创建:有3种方式创建一个NSRange变量

    • 方式1
    NSRange range;
    range.location = 7;
    range.length = 3;
    • 方式2
    NSRange range = {7, 3};
    或
    NSRange range = {.location = 7,.length = 3};
    • 方式3 : 使用NSMakeRange函数
    NSRange range = NSMakeRange(7, 3);

字符串截取

  • - (NSString *)substringFromIndex:(NSUInteger)from;
    • 从指定位置from开始(包括指定位置的字符)到尾部
    NSString *str = @"<head>笑忘书</head>";
    str = [str substringFromIndex:7];
    NSLog(@"str = %@", str);

输出结果: 笑忘书</head>
  • - (NSString *)substringToIndex:(NSUInteger)to;
    • 从字符串的开头一直截取到指定的位置to,但不包括该位置的字符
    NSString *str = @"<head>笑忘书</head>";
    str = [str substringToIndex:10];
    NSLog(@"str = %@", str);

输出结果: <head>笑忘书
  • - (NSString *)substringWithRange:(NSRange)range;
    • 按照所给出的NSRange从字符串中截取子串
    NSString *str = @"<head>笑忘书</head>";
    NSRange range;
    /*
    range.location = 6;
    range.length = 3;
    */
    range.location = [str rangeOfString:@">"].location + 1;
    range.length = [str rangeOfString:@"</"].location - range.location;
    NSString *res = [str substringWithRange:range];
    NSLog(@"res = %@", res);
输出结果: 笑忘书

字符串替换

  • - (NSString )stringByReplacingOccurrencesOfString:(NSString )target withString:(NSString *)replacement;
    • 用replacement替换target
    NSString *str = @"http:**baidu.com*img*xx.gif";
    NSString *newStr = [str stringByReplacingOccurrencesOfString:@"*" withString:@"/"];
    NSLog(@"newStr = %@", newStr);

输出结果: http://www.baidu.com/img/xx.gif
  • - (NSString )stringByTrimmingCharactersInSet:(NSCharacterSet )set;
    • 去除首尾
    NSString *str =  @"   http://baidu.com/img/xx.gif   ";
    NSString *newStr = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    NSLog(@"str =|%@|", str);
    NSLog(@"newStr =|%@|", newStr);

输出结果:
str =|   http://baidu.com/img/xx.gif   |
newStr =|http://baidu.com/img/xx.gif|
    NSString *str =  @"***http://baidu.com/img/xx.gif***";
    NSString *newStr = [str stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"*"]];

    NSLog(@"str =|%@|", str);
    NSLog(@"newStr =|%@|", newStr);

输出结果:
str =|***http://baidu.com/img/xx.gif***|
newStr =|http://baidu.com/img/xx.gif|

字符串与路径

  • - (BOOL)isAbsolutePath;
    • 是否为绝对路径
     // 其实就是判断是否以/开头
//    NSString *str = @"/Users/Lee/Desktop/xx.txt";
    NSString *str = @"Users/Lee/Desktop/xx.txt";
    if ([str isAbsolutePath]) {
        NSLog(@"是绝对路径");
    }else
    {
        NSLog(@"不是绝对路径");
    }
  • - (NSString *)lastPathComponent;
    • 获得最后一个目录
    // 截取最后一个/后面的内容
    NSString *str = @"/Users/Lee/Desktop/xx.txt";
    NSString *component = [str lastPathComponent];
    NSLog(@"component = %@", component);
  • - (NSString *)stringByDeletingLastPathComponent;
    • 删除最后一个目录
    // 其实就是上次最后一个/和之后的内容
    NSString *str = @"/Users/Lee/Desktop/xx.txt";
    NSString *newStr = [str stringByDeletingLastPathComponent];
    NSLog(@"newStr = %@", newStr);
  • - (NSString )stringByAppendingPathComponent:(NSString )str;
    • 在路径的后面拼接一个目录
      (也可以使用stringByAppendingString:或者stringByAppendingFormat:拼接字符串内容)
// 其实就是在最后面加上/和要拼接得内容
// 注意会判断后面有没有/有就不添加了, 没有就添加, 并且如果有多个会替换为1个
//    NSString *str = @"/Users/Lee/Desktop";
    NSString *str = @"/Users/Lee/Desktop/";
    NSString *newStr = [str stringByAppendingPathComponent:@"xx"];
    NSLog(@"newStr = %@", newStr);
  • - (NSString *)pathExtension;
    • 获得拓展名
    // 其实就是从最后面开始截取.之后的内容
//    NSString *str = @"xx.txt";
    NSString *str = @"abc.xx.txt";
    NSString *extension = [str pathExtension];
    NSLog(@"extension = %@", extension);
  • - (NSString *)stringByDeletingPathExtension;
    • 删除尾部的拓展名
    // 其实就是上次从最后面开始.之后的内容
//    NSString *str = @"xx.txt";
    NSString *str = @"abc.xx.txt";
    NSString *newStr = [str stringByDeletingPathExtension];
    NSLog(@"newStr = %@", newStr);
  • - (NSString )stringByAppendingPathExtension:(NSString )str;
    • 在尾部添加一个拓展名
// 其实就是在最后面拼接上.和指定的内容
    NSString *str = @"xx";
    NSString *newStr = [str stringByAppendingPathExtension:@"gif"];
    NSLog(@"newStr = %@", newStr);

字符串与基本数据类型转换

  • 获取字符串的每个字符

    • - (NSUInteger)length;

      • 返回字符串的长度(有多少个文字)
    • - (unichar)characterAtIndex:(NSUInteger)index;

      • 返回index位置对应的字符
  • 字符串和其他数据类型转换

    • 转为基本数据类型
      • - (double)doubleValue;
      • - (float)floatValue;
      • - (int)intValue;
    NSString *str1 = @"110";
    NSString *str2 = @"10";
    int res = str1.intValue + str2.intValue;
    NSLog(@"res = %i", res);
    NSString *str1 = @"110";
    NSString *str2 = @"10.1";
    double res = str1.doubleValue + str2.doubleValue;
    NSLog(@"res = %f", res);
    • 转为C语言中的字符串
      • - (char *)UTF8String;
    NSString *str = @"abc";
    const char *cStr = [str UTF8String];
    NSLog(@"cStr = %s", cStr);
    char *cStr = "abc";
    NSString *str = [NSString stringWithUTF8String:cStr];
    NSLog(@"str = %@", str);

三 NSMutableString

  • NSMutableString 类继承NSString类,NSMutableString好比一个字符串链表,它可以任意的动态在字符串中添加字符串 删除字符串 指定位置插入字符串。

  • NSMutableString和NSString的区别

    • NSString是不可变的, 里面的文字内容是不能进行修改的
    • NSMutableString是可变的,里面的文字内容可以随时更改
    • NSMutableString能使用NSString的所有方法
  • 字符串中的可变和不可变

    • 不可变:指的是字符串在内存中占用的存储空间固定,并且存储的内容不能发生变化
    • 可变:指的是字符串在内存中占用的存储空间可以不固定,并且存储的内容可以被修改

  • - (void)appendString:(NSString *)aString;
    • 拼接aString到最后面
  • - (void)appendFormat:(NSString *)format, …;
    • 拼接一段格式化字符串到最后面
  • - (void)deleteCharactersInRange:(NSRange)range;
    • 删除range范围内的字符串
    NSMutableString *strM = [NSMutableString stringWithString:@"http://www.baidu.com"];
     // 一般情况下利用rangeOfString和deleteCharactersInRange配合删除指定内容
     NSRange range = [strM rangeOfString:@"http://"];
     [strM deleteCharactersInRange:range];
     NSLog(@"strM = %@", strM);
  • - (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;
    • 在loc这个位置中插入aString
    NSMutableString *strM = [NSMutableString stringWithString:@"www.baidu.com"];
    // insertString : 需要插入的字符串
    // atIndex: 从哪里开始插入
    [strM insertString:@"http://" atIndex:0];
    NSLog(@"strM = %@", strM);
  • -(void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString;
    • 使用aString替换range范围内的字符串
    NSMutableString *strM = [NSMutableString stringWithString:@"http://www.baidu.com/GUO.png"];
    NSRange range = [strM rangeOfString:@"GUO"];
    // OccurrencesOfString: 需要替换的字符串
    // withString: 用什么替换
    // options: 替换时的搜索方式
    // range: 搜索的范围
    // 返回值: 代表替换了多少个字符串
    [strM replaceOccurrencesOfString:@"GUO" withString:@"jjj" options:0 range:range];
    NSLog(@"strM = %@", strM);

四 NSArray

  • 什么是NSArray?
    • NSArray是OC中的数组类,开发中建议尽量使用NSArray替代C语言中的数组
  • NSArray的使用注意

    • 只能存放任意OC对象, 并且是有顺序的
    • 不能存储非OC对象, 比如int\float\double\char\enum\struct等
    • 它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素
  • NSArray的创建方式

    • + (instancetype)array;
    • + (instancetype)arrayWithObject:(id)anObject;
    • + (instancetype)arrayWithObjects:(id)firstObj, …;
    • + (instancetype)arrayWithArray:(NSArray *)array;
    • + (id)arrayWithContentsOfFile:(NSString *)path;
    • + (id)arrayWithContentsOfURL:(NSURL *)url;

NSArray直接使用NSLog()作为字符串输出时是小括号括起来的形式。
NSArray中不能存储nil,因为NSArray认为nil是数组的结束(nil是数组元素结束的标记)。

  • NSArray的常用方法

    • - (NSUInteger)count;

      • 获取集合元素个数
    • - (id)objectAtIndex:(NSUInteger)index;

      • 获得index位置的元素
    • - (BOOL)containsObject:(id)anObject;

      • 是否包含某一个元素
    • - (id)lastObject;

      • 返回最后一个元素
    • - (id)firstObject;

      • 返回最后一个元素
    • - (NSUInteger)indexOfObject:(id)anObject;

      • 查找anObject元素在数组中的位置(如果找不到,返回-1)
    • - (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range;

      • 在range范围内查找anObject元素在数组中的位置
  • NSArray的简写形式

    • 数组的创建

      [NSArray arrayWithObjects:@"Jack", @"Rose", @"Jim", nil];
      // 简写为:
      @[@"Jack", @"Rose", @"Jim"];
      
    • 数组元素的访问

      [array objectAtIndex:0];  // 简写为:
      array[0];
      

NSArray 遍历

  • NSArray的下标遍历
    NSArray *arr = @[p1, p2, p3, p4, p5];
    for (int i = 0; i < arr.count; ++i) {
        Person *p = arr[i];
        [p say];
    }
  • NSArray的快速遍历
    NSArray *arr = @[p1, p2, p3, p4, p5];
   for (Person *p in arr) {
        [p say];
    }
  • NSArray 使用block进行遍历
    [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"obj = %@, idx = %lu", obj, idx);
        Person *p = obj;
        [p say];
    }];
  • NSArray给所有元素发消息
    • 让集合里面的所有元素都执行aSelector这个方法
      • - (void)makeObjectsPerformSelector:(SEL)aSelector;
      • - (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument;

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) {
        return obj1.age > obj2.age;
    }];
    NSLog(@"%@", newArr);

NSArray文件读写

  • NSArray数据写入到文件中
    NSArray *arr = @[@"ldj", @"lqj", @"jjj", @"xwq"];
    BOOL flag = [arr writeToFile:@"/Users/guo/Desktop/persons.plist" atomically:YES];
    NSLog(@"%i", flag);
  • 从文件中读取数据到NSArray中
    NSArray *newArr = [NSArray arrayWithContentsOfFile:@"/Users/guo/Desktop/persons.xml"];
    NSLog(@"%@", newArr);

NSArray 与字符串

  • 把数组元素链接成字符串
    • - (NSString )componentsJoinedByString:(NSString )separator;
      • 这是NSArray的方法, 用separator作拼接符将数组元素拼接成一个字符串
    NSArray *arr = @[@"ldj", @"lq", @"jjj", @"xwq"];
    NSString *res = [arr componentsJoinedByString:@"*"];
    NSLog(@"res = %@", res);
输出结果:
ldj*lq*jjj*xwq
  • 字符串分割方法
    • - (NSArray )componentsSeparatedByString:(NSString )separator;
      • 这是NSString的方法,将字符串用separator作为分隔符切割成数组元素
    NSString *str = @"lj-qj-jj-gj";
    NSArray *arr = [str componentsSeparatedByString:@"-"];
    NSLog(@"%@", arr);

输出结果:
(
    lj,
    lj,
    jj,
    gj
)

NSArray文件读写

  • NSArray数据写入到文件中
    NSArray *arr = @[@"lj", @"qj", @"jj", @"gj"];
    BOOL flag = [arr writeToFile:@"/Users/guo/Desktop/persons.plist" atomically:YES];
    NSLog(@"%i", flag);
  • 从文件中读取数据到NSArray中
    NSArray *newArr = [NSArray arrayWithContentsOfFile:@"/Users/guo/Desktop/persons.xml"];
    NSLog(@"%@", newArr);

五 NSMutableArray

  • 什么是NSMutableArray

    • NSMutableArray是NSArray的子类
    • NSArray是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素
    • NSMutableArray是可变的,随时可以往里面添加\更改\删除元素
  • NSMutableArray基本用法

    • 创建空数组
    NSMutableArray *arr = [NSMutableArray array];
    • 创建数组,并且指定长度为5,此时也是空数组
    NSMutableArray *arr2 = [[NSMutableArray alloc] initWithCapacity:5];
    • 创建一个数组,包含两个元素
    NSMutableArray *arr3 = [NSMutableArray arrayWithObjects:@"1",@"2", nil];
    • 调用对象方法创建数组
    NSMutableArray *arr4 = [[NSMutableArray alloc] initWithObjects:@"1",@"2", nil];
    • - (void)addObject:(id)object;

      • 添加一个元素
    • - (void)addObjectsFromArray:(NSArray *)array;

      • 添加otherArray的全部元素到当前数组中
    • - (void)insertObject:(id)anObject atIndex:(NSUInteger)index;

      • 在index位置插入一个元素
    • - (void)removeLastObject;

      • 删除最后一个元素
    • - (void)removeAllObjects;

      • 删除所有的元素
    • - (void)removeObjectAtIndex:(NSUInteger)index;

      • 删除index位置的元素
    • - (void)removeObject:(id)object;

      • 删除特定的元素
    • - (void)removeObjectsInRange:(NSRange)range;

      • 删除range范围内的所有元素
    • - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;

      • 用anObject替换index位置对应的元素
    • - (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;

      • 交换idx1和idx2位置的元素

注意:不能通过@[]来创建一个可变数组, 因为@[]创建出来的是一个不可变的数组
如果把一个不可变数组当做一个可变数组来使用, 会引发一个运行时的错误

六 NSDictionary

  • 什么是NSDictionary

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

 + (instancetype)dictionary;
 + (instancetype)dictionaryWithObject:(id)object forKey:(id <NSCopying>)key;
 + (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ...;
 + (id)dictionaryWithContentsOfFile:(NSString *)path;
 + (id)dictionaryWithContentsOfURL:(NSURL *)url;
  • NSDictionary创建简写
// 以前
   NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"xx", @"name", @"12345678", @"phone", @"天朝", @"address", nil];

// 现在
   NSDictionary *dict = @{@"name":@"GUO", @"phone":@"12345678", @"address":@"天朝"};
  • NSDictionary获取元素简写
[dict objectForKey:@"name”];
//  简写
dict[@"name”];
  • 键值对集合的特点

    • 字典存储的时候,必须是”键值对”的方式来存储(同时键不要重复)
    • 键值对中存储的数据是”无序的”
    • 键值对集合可以根据键, 快速获取数据
  • NSDictionary的遍历

    • - (NSUInteger)count;

      • 返回字典的键值对数目
    • - (id)objectForKey:(id)aKey;

      • 根据key取出value
  • 快速遍历

    NSDictionary *dict = @{@"name":@"xx", @"phone":@"12345678", @"address":@"天朝"};
    for (NSString *key in dict) {
        NSLog(@"key = %@, value = %@", key, dict[key]);
    }
  • Block遍历
    [dict enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop) {
        NSLog(@"key = %@, value = %@", key, obj);
    }];
  • NSDictionary文件操作

    • 将字典写入文件中

      • - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
      • - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;
      • 存结果是xml文件格式,但苹果官方推荐为plist后缀。
    • 从文件中读取字典

NSDictionary *newDict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/guo/Desktop/dict.plist"];
    NSLog(@"newDict = %@", newDict);

七 NSMutableDictionary

  • 什么是NSMutableDictionary

    • NSMutableDictionary是NSDictionary的子类
    • NSDictionary是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的,不能删除里面的元素, 也不能再往里面添加元素
    • NSMutableDictionary是可变的,随时可以往里面添加\更改\删除元素
  • NSMutableDictionary的常见操作

    • - (void)setObject:(id)anObject forKey:(id )aKey;

      • 添加一个键值对(会把aKey之前对应的值给替换掉)
    • - (void)removeObjectForKey:(id)aKey;

      • 通过aKey删除对应的value
    • - (void)removeAllObjects;

      • 删除所有的键值对
  • NSMutableDictionary的简写

    • 设置键值对
[dict setObject:@"Jack" forKey:@"name”];
// 简写
dict[@"name"] = @"Jack";
  • NSArray和NSDictionary的区别
    • NSArray是有序的,NSDictionary是无序的
    • NSArray是通过下标访问元素,NSDictionary是通过key访问元素

八 常见的结构体

  • 1.NSPoint和CGPoint
typedef CGPoint NSPoint;

CGPoint的定义
struct CGPoint {
  CGFloat x;
  CGFloat y;
};
typedef struct CGPoint CGPoint;
typedef double CGFloat;
  • CGPoint代表的是二维平面中的一个点

    • 可以使用CGPointMake和NSMakePoint函数创建CGPoint
  • 2.NSSize和CGSize

typedef CGSize NSSize;

CGSize的定义
struct CGSize {
  CGFloat width;
  CGFloat height;
};
typedef struct CGSize CGSize;
  • CGSize代表的是二维平面中的某个物体的尺寸(宽度和高度)

    • 可以使用CGSizeMake和NSMakeSize函数创建CGSize
  • 3.NSRect和CGRect

typedef CGRect NSRect;

CGRect的定义
struct CGRect {
  CGPoint origin;
  CGSize size;
};
typedef struct CGRect CGRect;
  • CGRect代表的是二维平面中的某个物体的位置和尺寸
    • 可以使用CGRectMake和NSMakeRect函数创建CGRect

九 NSNumber

  • NSArray\NSDictionary中只能存放OC对象,不能存放int\float\double等基本数据类

  • 如果真想把基本数据(比如int)放进数组或字典中,需要先将基本数据类型包装成OC对象

  • NSNumber可以将基本数据类型包装成对象,这样就可以间接将基本数据类型存进NSArray\NSDictionary中

  • NSNumber的创建

    • 以前:

      • + (NSNumber *)numberWithInt:(int)value;
      • + (NSNumber *)numberWithDouble:(double)value;
      • + (NSNumber *)numberWithBool:(BOOL)value;
    • 现在简写:

      • @10;
      • @10.5;
      • @YES;
  • 从NSNumber对象中的到基本类型数据

    • - (char)charValue;
    • - (int)intValue;
    • - (long)longValue;
    • - (double)doubleValue;
    • - (BOOL)boolValue;
    • - (NSString *)stringValue;
    • - (NSComparisonResult)compare:(NSNumber *)otherNumber;
    • - (BOOL)isEqualToNumber:(NSNumber *)number;

十 NSValue

  • NSValue基本概念
    • NSNumber是NSValue的子类, 但NSNumber只能包装数字类型
    • NSValue可以包装任意值
  • 常见结构体的包装

    • 将结构体包装成NSValue对象
      • + (NSValue *)valueWithPoint:(NSPoint)point;
      • + (NSValue *)valueWithSize:(NSSize)size;
      • + (NSValue *)valueWithRect:(NSRect)rect;
    • 从NSValue对象取出之前包装的结构体
      • - (NSPoint)pointValue;
      • - (NSSize)sizeValue;
      • - (NSRect)rectValue;
  • NSValue提供了下列方法来包装任意数据

    • + (NSValue )valueWithBytes:(const void )value objCType:(const char *)type;

      • value参数 : 所包装数据的地址
      • type参数 : 用来描述这个数据类型的字符串, 用@encode指令来生成
    • 从NSValue中取出所包装的数据

      • - (void)getValue:(void *)value;

十 NSDate

  • NSDate可以用来表示时间, 可以进行一些常见的日期\时间处理

    • 一个NSDate对象就代表一个时间
    • [NSDate date]返回的就是当前时间
    NSDate *now = [NSDate date];
    NSLog(@"now = %@", now);
     // 设置转换后的目标日期时区
     NSTimeZone *zone = [NSTimeZone systemTimeZone];
     // 得到源日期与世界标准时间的偏移量
     NSInteger interval = [zone secondsFromGMTForDate: date];
     NSLog(@"interval = %lu", interval);
     // 在当前时间基础上追加时区差值
     now = [now dateByAddingTimeInterval:interval];
     NSLog(@"%@", date);
  • 格式化日期

    • NSDate -> NSString
    // 1.创建时间
    NSDate *now = [NSDate date];
    // 2.创建时间格式化
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    // 3.指定格式
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    // 4.格式化时间
    NSString *str = [formatter stringFromDate:now];
    NSLog(@"%@", str);
    • NSString -> NSDate
    NSString *str = @"2015-06-28 19:53:24";
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSDate *date = [formatter dateFromString:str];
    NSLog(@"%@", date);
  • 结合NSCalendar和NSDate能做更多的日期\时间处理

    • 获得NSCalendar对象
    NSCalendar *calendar = [NSCalendar currentCalendar];
    • 获得年月日
    - (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)date;
    
    NSDate *date = [NSDate date];
    // 1.创建日历对象
    NSCalendar *calendar = [NSCalendar currentCalendar];
    // 2.利用日历对象获取年月日时分秒
    NSCalendarUnit type = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    NSDateComponents *cmps =[calendar components:type fromDate:date];
    NSLog(@"year = %lu", cmps.year);
    NSLog(@"month = %lu", cmps.month);
    NSLog(@"day = %lu", cmps.day);
    NSLog(@"hour = %lu", cmps.hour);
    NSLog(@"minute = %lu", cmps.minute);
    NSLog(@"second = %lu", cmps.second);
    NSLog(@"date = %@", date);
  • 比较两个日期的差距
    • - (NSDateComponents )components:(NSCalendarUnit)unitFlags fromDate:(NSDate )startingDate toDate:(NSDate *)resultDate options:(NSCalendarOptions)opts;
    // 1.确定时间
    NSString *time1 = @"2015-06-23 12:18:15";
    NSString *time2 = @"2015-06-28 10:10:10";
    // 2.将时间转换为date
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSDate *date1 = [formatter dateFromString:time1];
    NSDate *date2 = [formatter dateFromString:time2];
    // 3.创建日历
    NSCalendar *calendar = [NSCalendar currentCalendar];
     NSCalendarUnit type = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    // 4.利用日历对象比较两个时间的差值
    NSDateComponents *cmps = [calendar components:type fromDate:date1 toDate:date2 options:0];
    // 5.输出结果
    NSLog(@"两个时间相差%ld年%ld月%ld日%ld小时%ld分钟%ld秒", cmps.year, cmps.month, cmps.day, cmps.hour, cmps.minute, cmps.second);

十一 NSFileManager

  • 什么是NSFileManager

    • NSFileManager是用来管理文件系统的,它可以用来进行常见的文件\文件夹操作

    • NSFileManager使用了单例模式

      • 使用defaultManager方法可以获得那个单例对象
[NSFileManager defaultManager]
  • NSFileManager用法

    • - (BOOL)fileExistsAtPath:(NSString *)path;
      • path这个文件\文件夹是否存在
    NSFileManager *manager = [NSFileManager defaultManager];
    // 可以判断文件
    BOOL flag = [manager fileExistsAtPath:@"/Users/GUO/Desktop/GUO.txt"];
    NSLog(@"flag = %i", flag);
    // 可以判断文件夹
    flag = [manager fileExistsAtPath:@"/Users/GUO/Desktop/未命名文件夹"];
    NSLog(@"flag = %i", flag);
    • - (BOOL)fileExistsAtPath:(NSString )path isDirectory:(BOOL )isDirectory;
      • path这个文件\文件夹是否存在, isDirectory代表是否为文件夹
    NSFileManager *manager = [NSFileManager defaultManager];
    BOOL directory = NO;
    BOOL flag = [manager fileExistsAtPath:@"/Users/GUO/Desktop/未命名文件夹" isDirectory:&directory];
    NSLog(@"flag = %i, directory = %i", flag, directory);
    • - (BOOL)isReadableFileAtPath:(NSString *)path;

      • path这个文件\文件夹是否可读
    • - (BOOL)isWritableFileAtPath:(NSString *)path;

      • path这个文件\文件夹是否可写
      • 系统目录不允许写入
    • - (BOOL)isDeletableFileAtPath:(NSString *)path;

      • path这个文件\文件夹是否可删除
      • 系统目录不允许删除
  • NSFileManager的文件访问

    • - (NSDictionary )attributesOfItemAtPath:(NSString )path error:(NSError **)error;
      • 获得path这个文件\文件夹的属性
    NSFileManager *manager = [NSFileManager defaultManager];
    NSDictionary *dict = [manager attributesOfItemAtPath:@"/Users/guo/Desktop/guo.txt" error:nil];
    NSLog(@"dit = %@", dict);
    • - (NSArray )contentsOfDirectoryAtPath:(NSString )path error:(NSError **)error;

      • 获得path的当前子路径
        NSFileManager *manager = [NSFileManager defaultManager];
        NSArray *paths = [manager contentsOfDirectoryAtPath:@"/Users/guo/Desktop/" error:nil];
        NSLog(@"paths = %@", paths);
    • - (NSData )contentsAtPath:(NSString )path;

      • 获得文件内容
  • - (NSArray )subpathsAtPath:(NSString )path;

  • - (NSArray )subpathsOfDirectoryAtPath:(NSString )path error:(NSError **)error;
    • 获得path的所有子路径
    NSFileManager *manager = [NSFileManager defaultManager];
    NSArray *paths = [manager subpathsAtPath:@"/Users/guo/Desktop/"];
    NSLog(@"paths = %@", paths);
  • NSFileManager的文件操作
//   拷贝
- (BOOL)copyItemAtPath:(NSString **)srcPath toPath:(NSString **)dstPath error:(NSError **)error;
//   移动(剪切)
- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
//   删除
- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;
- (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary *)attributes error:(NSError **)error;
//   创建文件夹(createIntermediates为YES代表自动创建中间的文件夹)
    NSFileManager *manager = [NSFileManager defaultManager];
    BOOL flag = [manager createDirectoryAtPath:@"/Users/guo/Desktop/test" withIntermediateDirectories:YES attributes:nil error:nil];
    NSLog(@"flag = %i", flag);
  • - (BOOL)createFileAtPath:(NSString )path contents:(NSData )data attributes:(NSDictionary *)attr;
    • 创建文件(NSData是用来存储二进制字节数据的)
    NSString *str = @"xx";
    NSData  *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    NSFileManager *manager = [NSFileManager defaultManager];
    BOOL flag = [manager createFileAtPath:@"/Users/guo/Desktop/abc.txt" contents:data attributes:nil];
    NSLog(@"flag = %i", flag);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值