开发者社区> 凌浩雨> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Objective-C 学习第九天

简介: 一、 框架: 系统或者第三方事先写好的写很牛X功能的类,把这些类交给我们使用,这些类的集合就叫框架. Foundation框架: 是一个包,有很多类和函数,定义了一些数据类型.
+关注继续查看

一、

  1. 框架: 系统或者第三方事先写好的写很牛X功能的类,把这些类交给我们使用,这些类的集合就叫框架.
    Foundation框架: 是一个包,有很多类和函数,定义了一些数据类型.这个框架中的类都是一些最基础的类.其他的框架都是基于Foundation框架的.

    UIKit.
    AVFoundation.
    ......

  2. NSString
    1). NSString是一个数据类型,保存OC字符串.
    NSString的本质是一个类.
    最标准的创建NSString对象的方法:
    NSString *str1 = [NSString new]; NSString *str2 = [[NSString alloc] init]; NSString *str3 = [NSString string];
    使用这种方式创建的字符串是一个空的字符. @""
    NSString 对象是用来存储字符串的.
    2). NSString是OC中最常用的一个类,所以OC提供了一种更为快速的创建字符串对象的方式.
    使用前缀@
    @"jack": 本质是一个NSString对象,存储的是"jack"这个字符串
    NSString *str1 = @"rose";
    a. @"rose"本质是一个NSString对象,存储的是字符串"rose"
    b. 将这个字符串对象的地址返回赋值给str1指针
    格式控制符%p: 打印指针变量的值,打印地址
    格式控制符%@: 打印指针指向的对象

  3. NSString对象的恒定性
    1). 当我们使用简要的创建字符串对象的时候,也就是使用OC字符串常量来初始化字符串指针的时候,这个字符串对象是存储在常量区的.
    NSString *str = @"jack";
    当我们调用NSString的类方法来创建对象的时候, 创建的对象是存储在堆区的.
    NSString *str = [NSString stringWithFormat:@"jack"];
    NSString *str = [NSString new];

    2). 恒定性
    当在内存中创建一个字符串对象后,这个字符串对象的内容就无法更改.
    当我们重新为字符串指针初始化值的时候,并不是修改原来的字符串对象,而是重新的创建一个字符串对象,将这个字符串对象的地址重新赋值给字符串指针变量.

    3). 当系统准备要在内存中创建字符串对象的时候,会先检查内存中是否有相同内容的字符串对象,如果有直接指向,如果没有才会重新创建.

    4). 存储在常量区的数据不会被回收,所以存储在常量区的字符串也不会被回收.

  4. NSString类中使用频率最高的方法
    1). 使用拼接的方式创建一个NSString对象
    + (instancetype)stringWithFormat:(NSString *)format,...

        int age = 10;
        NSString *str = @"jack";
        NSString *newStr = [NSString stringWithFormat:@"大家好,我叫%@,今年%d岁",str,age];
    

    2). 得到字符串的长度
    @property (readonly) NSUInteger length;

        NSString *str = @"jack";
        NSUInteger len = str.length;
    

    3). 得到字符串当中指定下标的字符
    - (unichar)characterAtIndex:(NSUInteger)index;
    返回值是unichar类型的,要打印的话使用%C

        NSString *str = @"jack";
        unichar ch = [str characterAtIndex:2];
        NSLog(@"ch = %C", ch);
    

    4). 判断两个字符串的内容是否相等
    a. 不能使用==来判断OC字符串的内容是否相同
    b. == 运算符的作用: 比较左右两边的数据是否相同.
    c. 所以如果我们要比较两个OC字符串的内容是否相同,不能使用==去比较.因为==比较的是字符串指针变量的值,而我们比较的是字符串的内容
    - (BOOL)isEqualToString:(NSString *) aString;
    可以比较字符串的内容

        NSString *str1 = @"jack";
        NSString *str2 = @"jack";
        [str1 isEqualToString:str2];
    

    5). 将C语言的字符串转换为OC字符串
    + (instancetype)stringWithUTF8String:(NSString *)string;

        char *str = "jack";
        NSString *str1 = [NSString stringWithUTF8String: str];
    

    6). 将OC字符串转换为C语言字符串
    @property (nullable, readonly) __strong const char *UTF8String;

        NSString *str = @"jack";
        const char *str1 = str.UTF*String;
    
  5. 字符串读写
    1). 将一个字符串写入到磁盘上的某一个文件

    • (BOOL) writeToFile:(NSString *)path atomically:(BOOL)userAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
      参数1: 将字符串内容写入到哪一个文件之中,写上文件的路径.
      参数2: YES,先将内容写入到一个临时文件,如果成功过再搬到指定的目录; NO,直接将内容写入到指定的文件,不安全,效率高
      参数3: 指定写入的时候的编码.一般情况下使用UTF8. NSUTF8StringEncoding
      参数4: 二级指针,要传递一个NSError指针的地址.如果写入成功,这个指针的值就是nil,如果失败,这个指针就会指向一个错误对象,这个对象描述了发生错误的信息. err.localizedDescription中存储发生错误的信息
      返回值是BOOL类型,代表是否写入成功.
        NSString *str = @"jack";
        NSError *err;
        [str writeToFile:@"/Users/Itcast/Desktop/abc.txt", atomically:NO encoding:NSUTF8StringEncoding error:&err];
    

    2). 从磁盘文件读取内容

    • (instancetype) stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
      参数1:文件的路径
      参数2:使用的编码NSUTF8StringEncoding
      参数3:错误对象
        NSError *err;
        [NSString stringWithContentsOfFile:@"/Users/Itcast/Desktop/abc.txt" encoding:NSUTF8StringEncoding error:&err];
    
  6. 使用URL来读写字符串数据.
    1). 优势: 皆可以读取本地磁盘文件,还可以读写网页文件、ftp服务器文件
    2). 不同类型的URL地址的写法
    a. 本地磁盘文件: file://+路径---->file:///Users/Itcast/Desktop/abc.txt
    b. 网页地址: http://www.baidu.com/
    c. ftp服务器文件的地址: ftp://server.itcast.cn/1.txt

    1. 将不同类型的地址封装在NSURL对象中
      a. 从指定资源路径读取文本内容
      • (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
        b. 将字符串的内容写入到资源路径中
      • (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
        c. 如果要向网页或者ftp写内容要有权限.
        NSURL *u1 = [NSURL URLWithString:@"http://www.itcast.cn"];
        NSString *str = [NSString stringWithContentsOfURL:u1 encoding:NSUTF8StringEncoding error:nil];
    
        NSURL *u1 = [NSURL URLWithString:@"file:///Users/Itcast/Desktop/abc.txt"];
        NSString *str = @"hehehe";
        BOOL res = [str writeToURL:u1 atomically:NO encoding:NSUTF8StringEncoding error:nil];
    
    
  7. 字符串比较
    1). 不忽略大小写

    • (NSComparisonResult)compare:(NSString *)string;
        NSString *str1 = @"hehehe";
        NSString *str2 = @"jack";
        NSComparisonResult res = [str compare:str2];
        swith(res){
            case NSOrderedAscending://str1小
            break;
            case NSOrderedSame://一样大
            break;
            case NSOrderedDescending://str2小
            break;
            default:
            break;
        }
    

    2). 忽略大小写

        NSString *str1 = @"hehehe";
        NSString *str2 = @"JACK";
    
        NSComparisonResult res = [str compare:str2 option:NSCaseInsensitiveSearch];
        swith(res){
            case NSOrderedAscending://str1小
            break;
            case NSOrderedSame://一样大
            break;
            case NSOrderedDescending://str2小
            break;
            default:
            break;
        }
    

    3). 比较字符串中的数字

        NSString *str1 = @"hehehe001";
        NSString *str2 = @"hehehe002";
    
        NSComparisonResult res = [str compare:str2 option:NSNumericSearch];// 只能比格式固定的
        swith(res){
            case NSOrderedAscending://str1小
            break;
            case NSOrderedSame://一样大
            break;
            case NSOrderedDescending://str2小
            break;
            default:
            break;
        }
    

    4). 判断是否以某个字符串开头

        NSString *str = @"http://www.baidu.com/";
        BOOL res = [str hasPrefix:@"http://"];
    

    5). 判断是否以某个字符串结束

        NSString *str = @"/Users/Apple/Music/我们不一样.mp3";
        BOOL res = [str hasSuffix:@".mp3"];
    
  8. 在主串中搜索子串
    1). 从前往后
    - (NSRange) rangeOfString:(NSString *)searchString;
    返回值NSRange类型的结构体变量
    typedef struct _NSRange{ NSUInteger location;//代表子串在主串出现的下标 NSUInteger length;//代表子串在主串中匹配的长度 } NSRange;
    NSString *str = @"i love itcast!"; // 在str字符串中搜索@"love"出现的范围 NSRange range = [str rangeOfString:@"love"]; if(range.location==NSNotFound){ // 没有找到 } else { // 找到了 } 或者 if(range.length==0){ // 没有找到 } else { // 找到了 }
    2). 从后往前
    NSString *str = @"i love itcast love!"; // 在str字符串中搜索@"love"出现的范围 NSRange range = [str rangeOfString:@"love" options: NSBackwardsSearch]

  9. NSRange结构体
    1). 是Foundation框架中定义的一个结构体
    typedef struct _NSRange{ NSUInteger location;//代表子串在主串出现的下标 NSUInteger length;//代表子串在主串中匹配的长度 } NSRange;
    NSRange range;
    // 这个结构体变量一般情况下用来表示一段范围,特别用在子串在主串中的范围.
    2). 声明并初始化结构体变量的方式
    a. 最原始的方式
    NSRange range; range.location = 3; range.length = 4;
    b. 第二种方式: NSRange range = {3, 7};
    c. 第三种方式: NSRange range = {.location = 3, .length=7};
    d. Foundation框架中定义了一个函数,这个函数可以快速的创建一个NSRange结构体.
    NSMakeRange(loc, len);返回一个指定属性的NSRange结构体变量
    NSRange range = NSMakeRange(3,7);
    5. 可以将NSRange结构体变量转换为NSString.
    NSRange range = NSMakeRange(3,7);
    NSString *str = NSStringFromRange(range);

  10. 字符串截取
    1). 取到字符串中的一部分

    • (NSString *)substringFromIndex(NSUIntege)from;
      从指定的下标处一直截取到最后
        NSString *str = @"背景连锁酒店分开计算懒死了";
        NSString *newStr = [str substringFromIndex:3];
    

    2). 从第0个开始截取指定的个数

    • (NSString *)substringToIndex(NSUIntege)to;
      3). 从指定位置截取指定长度的字符串
    • (NSString *)substringWithRange(NSRange)range;
  11. 字符串替换
    1).

    • (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement;
      将字符串中第一个参数替换为第二个参数,原来的指针指向的内容是不会变的,新串是以方法的返回值返回的.
        NSString *str = @"背景连锁酒店分开计算懒死了";
        NSString *newStr = [str stringByReplacingOccurrencesOfString:@"背景" withString:@"广州"];
    
  12. 字符串数据转换为其他类型
    @property (readonly)double doubleValue;
    @property (readonly)float floatValue;
    @property (readonly)int intValue;
    @property (readonly)NSUINteger integerValue;
    @property (readonly)long long longLongValue;
    @property (readonly)BOOL boolValue;

    转换注意:

  13. 其他
    1). 去掉字符串前后的空格

        NSString *str = @" Jack ";
        [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    

    2). 将字符串转换为大写或者小写

        NSString *str = @" Jack ";
        [str uppercaseString];
        [str lowercaseString];
    

二、

  1. NSMutableString
    1). 是Foundation框架中的一个类,从NSString继承,是用来存储字符串数据的.
    2). NSMutableString在父类NSString的基础之上做扩展,存储在NSMutableString对象中的数据具有可变性,不会新创建对象.

  2. NSMutableString的用法
    1). 创建对象

        NSMutableString *str = [NSMutableString string];
        [str appendString:@"jack"];
    

    2). 往可变字符串对象中追加字符串

    • (void)appendString:(NSString *)aString;// 直接追加内容
    • (void)appendFormat:(NSString *)format...;// 以拼接的方式往可变字符串对象中追加内容
      3). 创建NSMutableString对象时,不能使用如下方式:
        NSMutableString *str = @"jack";
    

    4). NSMutableString做大批量的字符串拼接,速度快,因为NSMutableString只有一个,每次修改的时候直接修改对象的内容

  3. 使用建议
    1). 平时使用,还是使用NSString,因为效率高
    2). 大批量的数据拼接的时候使用NSMutableString
    10次以上使用NSMutableString.

  4. NSArray
    1). 是Foundation框架中的一个类,用来存储多个数据,具备数组功能,所以NSArray是OC中的数组
    2). 特点:
    a. 只能存储OC对象
    b. 长度固定,一旦NSArray数组创建完毕之后,元素的长度固定,无法新增、删除元素.
    c. 每一个元素都是紧密相连的,每一个元素仍然有自己的下标.
    d. 元素的类型是id类型的
    3). NSArray数组的创建
    1). 因为是一个类,所以就是创建NSArray对象.
    NSArray *arr1 = [NSArray new]; NSArray *arr2 = [[NSArray alloc] init]; NSArray *arr3 = [NSArray array];
    这样创建出来的NSArray数组的元素的个数是0个,因为长度固定,所以没有任何意义.
    2). 创建数组的同时指定一个数组的元素,仍然没有意义
    NSArray *arr1 = [NSArray arrayWithObject:@"jack"];
    3). 最常用创建NSArray数组的方式.
    + (instancetype)arrayWithObjects:(ObjectType)firstObj,...
    NSArray *arr1 = [NSArray arrayWithObjects:@"jack",@"rose",@"lili",nil];
    4). 创建NSArray简要方式
    NSArray *arr = @[@"jack", @"rose", @"lili"];
    5). 使用注意
    a. 只能存储OC对象,不能存储非OC对象
    b. 将元素写完之后,最后要写一个nil,表示元素到此结束了

  5. NSArray数组的编译
    1). for循环
    原理: 将下标挨个遍历出来

        NSArray *arr = @[@"jack",@"rose"];
        for(int i=0;i<arr.count;i++){
            //NSLog(@"%@",arr[i]);
            NSLog(@"%@", [arr objectAtIndex:i]);
        }
    

    2). 使用增强for循环
    a. 语法格式:
    for(元素类型 变量名 in 数组名){
    直接通过变量名拿到数组中的每一个元素
    }
    NSArray *arr = @[@"jack",@"rose"]; for(NSString *str in arr){ NSLog(@"%@", str); }
    b. 声明在for()中的变量叫做迭代变量
    c. 执行变量
    将数组中的第一个元素的值赋值给迭代变量,执行循环体
    ...
    结束循环
    d. 语法总结
    -> 迭代变量的类型和数组中的元素的类型保持一致
    -> 迭代变量的名称可以任意取
    -> in是固定的
    -> 遍历那个数组就将数组写在in后面
    -> 循环体里面,迭代变量的值就是元素的值

     当NSArray数组中存储的数据类型不一致的时候,迭代变量的类型建议使用id类型
    
    1. 使用block遍历
      • (void) enumerateObjectsUsingBlock:(void (^)OjbectType obj, NSUInteger idx, BOOL *stop))block;
        这是一个方法,这个方法作用来遍历数组中的每一个元素
          NSArray *arr = @[@"jack",@"rose"];
          // 将arr数组中的每一个元素遍历出来
          [arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop){
              NSLog(@"%@", obj);
              // 如果想停止循环,就将*stop设置为YES
          }]; 
      
  6. NSArray和NSString
    1). 将数组中元素连接起来组成一个新的字符串

    • (NSString *)componentsJoinedByString:(NSString *)separator
      参数: 连接符
        NSArray *arr = @[@"jack", @"rose", @"lili"];
        NSString *str = [arr componentsJoinedByString:@"#"];
    

    2). 将字符串按指定分隔符分割

        NSString *str = @"北京,昌平区,传智";
        // 使用字符串进行分割
        NSArray *arr = [str componentsSeparatedByString:","];
    
  7. NSMutableArray是NSArray的子类
    1). NSMutableArray仍然是一个数组,就被NSArray的特点,只能存储OC对象,每一个元素是紧密相连的。
    2). NSMutableArray相对于父类做的扩展,NSMutableArray数组的元素可以动态的新增和删除,其他用法与NSArray一致。
    所以:
    NSArray数组一旦创建,其元素的个数就固定,无法新增与删除
    NSMutableArray数组,可以新增删除
    3). NSMutableArray数组的创建
    NSMutableArray *arr1 = [NSMutableArray new]; NSMutableArray *arr2 = [[NSMutableArray alloc] init]; NSMutableArray *arr3 = [NSMutableArray array];
    这样创建出来的数组对象,数组的元素是0,但是有意义,可以动态的新增,删除.
    最容易犯错:这样写不可以
    NSMutableArray *arr1 = @[@"jack", @"rose", @"lili"];

  8. 新增与删除

    1. 新增
      a. // 将传入的参数作为数组的元素添加进去
      - (void)addObject:(ObjectType)anObject;
      // 将另外一个数组中的每一个元素添加到可变数组中
      - (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;
      NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr];
      b. 在可变数组中指定的数组中插入一个元素
      - (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
      [arr insertObject:@"lilei", anIndex:1];
    2. 删除
      a. 删除
      // 删除指定下标的元素
      - (void) removeObjectAtIndex:(NSUInteger)index;
      NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr]; [arr removeObjectAtIndex:1];
      b. 删除特定的元素
      - (void)removeObject:(ObjectType)anObject;
      NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr]; [arr removeObject:@"lili"];
      c. 删除指定范围内的元素
      - (void)removeObject:(ObjectType)anObject inRange:(NSRange)range;
      NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr]; [arr removeObject:@"lili" inRange:NSMakeRange(0, 3)];
      d. 删除最后一个元素
      - (void)removeLastObject;
      NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr]; [arr removeLastObject];
      e. 删除所有
      - (void)removeAllObjects;
      NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr]; [arr removeAllObjects];
  9. NSNumber
    1). 作用: 包装基本数据类型

        NSNumber *number = [NSNumber numberWithInt:10];
        等价于
        NSNumber *number = @10;
    

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C++ 开发者快速学习 Objective-C 语言核心语法
本文将讨论 Objective-C 语言的核心语法。这部分开始详述一些具体的语法。正如你期待的一样,涉及到了定义和类。
0 0
Objective-C 学习第十天
一、NSDictionary NSArray和NSMutableArray数组 存储数据特点:每个元素紧密相连,并且每个元素中都是直接存储的值. 缺点:数组元素下标不固定,都有可能发生变化,无法通过下标来唯一确定数组中的元素.
696 0
Objective-C 学习第八天
一、延展 延展: Extension 1). 是一个特殊的分类,所以延展也是类的一部分 2). 特殊之处: a. 延展这个特殊的分类没有名字 b. 只有声明没有实现,和本类共享一个实现 延展的语法 语法: @interface 本类名 () @end 没有实现,和本类共享一个实现.
753 0
Objective-C 学习第七天
一、 自动释放池的原理 存入到自动释放池中的对象,在自动释放池销毁的时候,会自动调用储存在该自动释放池中的所有对象的release方法. 可以解决的问题: 将创建的对象,存入到自动释放池之中,就不再需要手动的release这个对象了,因为池子销毁的时候,就会自动的调用池中所有的对象release.
618 0
Objective-C 学习第六天
一、 内存管理 内存的作用: 存储数据. 1). 如何将数据存储到内存之中 声明1个变量,将这个数据存储进去 2). 当数据不再被使用的时候,占用的内存空间如何被释放 内存中的五大区域 栈:局部变量,当局部变量的作用域被执行完毕之后,这个局部变量就会被系统立即回收.
848 0
Objective-C 学习第五天
一、 创建一个对象,内存是如何分配 1). 子类对象中有自己的属性和所有父类的属性 2). 代码段中每一个类都有一个isa指针,这个指针指向它的父类. 结构体与类 相同点: 都可以将多个数据封装为1个整体 struct Data{ ...
499 0
Objective-C 学习第四天
一、 Xcode文档的安装 1). Xcode文档提供了很多框架, 框架当中有很多类和函数, 提供的一些数据类型. 2). Xcode文档需要单独安装.
739 0
Objective-C 学习第三天
封装 一、 什么是错误 一般情况下,错误是指源代码不符合语法规范,然后编译报错 后果: 程序无法编译 什么是Bug? 程序可以编译、链接、执行,但是程序执行的结果不是我们预想的。
720 0
Objective-C 学习第二天
一、 对象在内存中的存储 内存中的五大区域 栈 存储局部变量 堆 程度员手动申请的字节看空间 malloc calloc realloc函数 BSS段 存储未被初始化的全局变量, 静态变量 数据段(常量区) 存储已被初始化的全局、静态变量、常量数据 代码段 存储代码 存储代码程序 类加载 a.
428 0
玩转 Objective-C 的 Mock 对象
测试驱动开发(TDD)中,开发者经常使用模拟对象进行系统设计,模拟对象到底是什么呢?部分模拟对象和全部模拟对象又是什么呢?模拟对象真的让人又爱又恨吗?让我们以Objective-C测试框架OCMock来探个究竟。
0 0
+关注
凌浩雨
毕业于贵州大学大数据与信息工程学院,目前是一名移动端工程师,就职于北京乾元大通信息技术有限责任公司。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Swift在Airbnb的应用实践
立即下载
JSPatch 成长之路
立即下载
为什么要学函数式编程?
立即下载