[Objective-C]第九天

Foundation框架.

NSString

NSMutableString

NSArray

NSMutableArray

NSDictionary

NSMutableDictionary

NSFileManger

NSDate

NSVlue

NSNumber

copy

单例模式.

----------------

1. 延展

什么时候用以及如何使用?

2. block

1).应用场景

3. 协议

1).

2). 协议的类型限制.

3). 简单的代理设计模式.

对象的属性 任何类型的对象都可以 但是要求遵守指定的协议.

因为要调用对象的协议方法.

02-NSString

  1. 框架: 就是系统(苹果)或者第三方(其他的一些高手)事先写好了一些很牛X功能的类.

          把这些类交给我们使用.这些类的集合我们叫做框架.

          框架中有很多很多功能相似的类. 函数库

     Foundation框架:  是1个包 这里面有很多类、函数、定义了一些数据类型.

                      这个框架中的类都是一些最基础的类. NSString NSObject

                     其他的框架都是基于Foundation框架的.

     UIKit.

     AVFoundation.

     ......

  2. Foundation框架中的最常用的类. 简单的爆.量大.

  3. NSString

     1). NSString是1个数据类型.保存OC字符串的.

         NSString的本质是1个类.既然是1个类.

         所以,最标准的创建NSString对象的方式:

NSString *str1 = [NSString new];
NSString *str2 = [[NSString alloc] init];
NSString *str3 = [NSString string];

         使用这种方式创建的字符串是1个空的字符.  @""

         NSString对象就是用来存储字符串.

     2). NSString是OC中最常用的1个类了.所以OC提供了一种更为快速的创建字符串对象的方式.

         使用前缀@

         @"jack"; 本质上这是1个NSString对象.这个NSString对象中存储的是"jack"这个字符串.

NSString *str1 = @"rose";

        1).  @"rose"本质上是1个NSString对象,这个对象中存储的是字符串"rose".

        2).  将这个字符串对象的地址返回赋值给str1指针.

         格式控制符%p  :  打印指针变量的值.打印地址.

                           %@ :  打印指针指向的对象.

 4. NSString的恒定性.

     1). 当我们使用简要的创建字符串对象的时候.也就是使用1个OC字符串常量来初始化字符串指针的时候.

         这个字符串对象是存储在 常量区(数据段) 的.

NSString *str = @"jack";

         当我们调用NSString的类方法来创建对象的时候.

NSString *str =  [NSString stringWithFormar:@"jack"];
NSString *str1 = [NSString new];

         创建的字符串对象是存储在堆区.

     2). 当在内存中创建1个字符串对象以后.这个字符串对象的内容就无法更改.

         当我们重新为字符串指针初始化值的时候.并不是修改原来的字符串对象 

         而是重新的创建1个字符串对象 将这个字符串对象的地址重新复制给字符串指针变量.

     3). 当系统准备要在内存中创建字符串对象的时候.会先检查内存中是否有相同内容的字符串对象.

         如果有,直接指向. 如果没有才会重新创建.

 

[疑惑:汉字字符串未必遵守这个原则]

 

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

03-NSString常用成员

  1. NSString是1个类.那么肯定其中有很多的方法.

  2. 使用频率最最高的几个方法.

     1). 使用拼接的方式创建1个NSString对象.

+ (instancetype)stringWithFormat:(NSString *)format, ... 

     2). 得到字符串的长度.

@property (readonly) NSUInteger length;

     3). 得到字符串中指定下标的字符.

- (unichar)characterAtIndex:(NSUInteger)index;

         返回值是unichar类型的 要打印的话使用%C

    int age = 10 ;
    NSString * str = @"王大锤";
    
    //+ (instancetype)stringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
    //类方法: 使用拼接的方式创建1个NSString对象
    NSString * newStr = [NSString stringWithFormat:@"大家好我叫%@,我今年%d岁",str,age];
    NSLog(@"【newStr】= %@",newStr);
    
    //@property (readonly) NSUInteger length;
    //属性:length(得到字符串长度)
    
    NSUInteger len = newStr.length;
    NSLog(@"【newStr 字符串长度为】= %lu",len);
    
    //- (unichar)characterAtIndex:(NSUInteger)index;
    //方法:characterAtIndex(得到字符串中制定下标的字符)
    
    unichar ch = [newStr characterAtIndex:1];
    NSLog(@"【newStr字符串中下标为1的个字符是】= %C", ch);

     4). 判断两个字符串的内容是否相同.

         a. 能否使用 == 来判断两个OC字符串的内容是否相同.(不能

         b. == 运算符的作用: 比较左右两边的数据是否相同.

            ->   10 == 10  这个时候直接比较的是左右两边的数据是否相同.

            ->   a == b   两边也可以写1个变量.这个时候比较是左右两边的变量的值是否相同.

            ->   如果两边是1个指针变量.那么比较的也是变量的值. 只不过指针变量的值是地址.

         c. 所以,如果我们要比较两个OC字符串的内容是否相同.不能使用 == 去比较.

            因为 == 比较的是字符串指针变量的值.而我们要比的是两个字符串指针指向的字符串对象的内容是否相同.

         c. 调用方法: 

- (BOOL)isEqualToString:(NSString *)aString;

            就可以比较当前字符串对象和传入的字符串对象的内容是否相同.

#define logBOOL(var) NSLog(@"%@",var==YES?@"YES":@"NO");

int main(int argc, const char * argv[]) {
    
    NSString * str1 = @"王大锤";
    NSString * str2 = [NSString stringWithFormat:@"王大锤"];

    //- (BOOL)isEqualToString:(NSString *)aString;
    //比较当前字符串对象和传入的字符串对象的内容是否相同

    BOOL res = [str1 isEqualToString:str2];
    logBOOL(res);
    
    return 0;
}

     5). 将C语言的字符串转换为OC字符串对象.

+ (nullable instancetype)stringWithUTF8String:(const char *)nullTerminatedCString;
    Person * p1 = [Person new];
    printf("请输入姓名:");
    char str[10];
    scanf("%s",str);
    
    //+ (nullable instancetype)stringWithUTF8String:(const char *)nullTerminatedCString;
    //将C语言的字符串转换为OC字符串对象
    p1.name = [NSString stringWithUTF8String:str];
    
    NSLog(@"p1.name = %@",p1.name);

     6). 将OC字符串对象转换为C语言的字符串.

@property (nullable, readonly) __strong const char *UTF8String NS_RETURNS_INNER_POINTER;	
// Convenience to return null-terminated UTF8 representation
//将OC字符串对象转换为C语言的字符串.
    

    NSString * str = @"王大锤";
    
    //@property (nullable, readonly) __strong const char *UTF8String NS_RETURNS_INNER_POINTER;	// Convenience to return null-terminated UTF8 representation
    //将OC字符串对象转换为C语言的字符串.
    const char * cstr = str.UTF8String;
    printf("    %s    \n",cstr);

04-NSString类的常用方法

  1. 将字符串写入到指定的文件中.

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;

参数解释:

     第1个参数: 路径. 要将字符串写入到那 1 个文件之中. 

     第2个参数: 保证原子性.

    [如果为YES则会先创建 1 个临时文件,将内容写到这个临时文件中.如果成功再将临时文件拷贝到指 定的目录. 这样做的好处是安全,不易出错.但是效率较低. 如果为 NO,直接将字符串写到指定的文件之中.这样写不 安全 但是效率高. 建议使用 NO.]

     第3个参数: 以哪种字符编码将字符串数据写入到文件,这里传入:NSUTF8StringEncoding

     第4个参数: 二级指针.传入1个 NSError 的1个二级指针.

     [如果方法执行成功.则方法执行完毕之后. 这个 NSError 的指针的值为 nil 如果方法执行失败.则方法执行完毕之后 这个 NSErro 指针会指向 1 个错误对象. 可以打印这个错误对象得到发生错误的详细信息.

     调用 NSError 对象的 localizedDescription 方法 可以拿到发生错误的简要发生原因.

     所以,判断是否写入成功就可以判断这个 NSError 指针是否为 nil 如果为 nil 说明写入成功,如果不为 nil 就说明写入失败.]

     返回值 BOOL.代表是否写入成功.

    NSString * str = @"号外号外:刘铁柱暴打王大锤!";

    NSError *err;
    //- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
    // 将字符串写入到指定的文件中.
   
    BOOL res =[str writeToFile:@"/Users/babylon/Desktop/code/day9_oc/day09/day09/haowai.txt" atomically:NO encoding:NSUTF8StringEncoding error:&err];

    //第一种判断方式:
    NSLog(@"%@",res==YES?@"写入成功!":@"写入失败!");
    
    //第二种判断方式:
    if (err != Nil) {
        NSLog(@"%@",err.localizedDescription);
    }
    else{
        NSLog(@"写入成功~");
    }

故意输错误的路径来测试下失败的提示:

  2. 将文件中的内容读取到字符串中.

+ (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;

     nullable 代表返回的对象有可能是nil

   NSError *err;
    
    //+ (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
    //将文件中的内容读取到字符串中.
    
   NSString * str =[NSString stringWithContentsOfFile:@"/Users/babylon/Desktop/code/day9_oc/day09/day09/haowai.txt" encoding:NSUTF8StringEncoding error:&err];

    if (err != Nil) {
        NSLog(@"%@",err.localizedDescription);
    }
    else{
        NSLog(@"%@",str);
    }

  3. 使用NSURL读写资源.

     1). NSURL对象. 专门用来保存资源地址的. 资源地址: 本地磁盘路径、网页地址、ftp文件地址.

     2). 资源路径的地址的写法:

         http://   开头的是网页路径的写法.

         file://   开头的是本地磁盘的路径

         ftp://    开头的是ftp文件资源的路径

         如果要讲1个资源路径的地址保存到NSURL对象中 地址一定要是标准写法.

     3). 如何将资源地址存储到NSURL对象中.

         NSURL *url1 = [NSURL URLWithString:@"https://www.baidu.com/"];

         NSURL *url2 = [NSURL URLWithString:@"ftp://server.itcast.cn/ccc.txt"];

         NSURL *url3 = [NSURL URLWithString:@"file:///Users/Apple/Desktop/abc.txt"];

     4). 读取 NSURL 对象中保持的路径的文件数据.(类方法)

+(nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;

        第 1 个参数: 封装了地址的 NSURL 对象
        第 2 个参数: 编码方式,一般传递 NSUTF8StringEncoding

        第 3 个参数: 二级指针.传入 1 个 NSError 的 1 个二级指针.

        如果方法执行成功.则方法执行完毕之后. 这个 NSError 的指针的值为 nil

        如果方法执行失败.则方法执行完毕之后 这个 NSErro 指针会指向 1 个错误对象.可以打印这个错误对象得 到发生错误的详细信息.
        所以,判断是否读取成功就可以判断这个 NSError 指针是否为 nil 如果为 nil 说明读取成功,如果不为 nil 就说明读取失败.
        返回值.为读取到的字符串数据.

如果 NSURL 对象中保存的地址是本地文件的地址.就会去指定的本地文件中读取字符串数据. 如果 NSURL 对象中保存的地址是 1 个网页地址.就会去下载这个网页的源代码.
如果 NSURL 对象中保存的地址是 1 个 ftp 文件地址.就会去下载这个文件的内容.

    NSError *err;
    
    NSURL * u1 = [NSURL URLWithString:@"https://blog.csdn.net/panjiye82/"];
    
    //+ (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
    //读取 NSURL 对象中保持的路径的文件数据.
    
    NSString * htmlcode = [NSString stringWithContentsOfURL:u1 encoding:NSUTF8StringEncoding error:&err];
    
    if (err != nil) {
        NSLog(@"%@",err.localizedDescription);
    }
    else{
        NSLog(@"%@",htmlcode);
    }

         5).向 NSURL 对象保持的地址写入字符串数据.

- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;

     第1个参数: 封装了地址的 NSURL 对象.

     第2个参数: 保证原子性.

    [如果为YES则会先创建 1 个临时文件,将内容写到这个临时文件中.如果成功再将临时文件拷贝到指 定的目录. 这样做的好处是安全,不易出错.但是效率较低. 如果为 NO,直接将字符串写到指定的文件之中.这样写不 安全 但是效率高. 建议使用 NO.]

     第3个参数: 以哪种字符编码将字符串数据写入到文件,这里传入:NSUTF8StringEncoding

     第4个参数: 二级指针.传入1个 NSError 的1个二级指针.

     [如果方法执行成功.则方法执行完毕之后. 这个 NSError 的指针的值为 nil 如果方法执行失败.则方法执行完毕之后 这个 NSErro 指针会指向 1 个错误对象. 可以打印这个错误对象得到发生错误的详细信息.

     调用 NSError 对象的 localizedDescription 方法 可以拿到发生错误的简要发生原因.

     所以,判断是否写入成功就可以判断这个 NSError 指针是否为 nil 如果为 nil 说明写入成功,如果不为 nil 就说明写入失败.]

     返回值 BOOL.代表是否写入成功.

    NSError *err;
    
    NSURL * u1 = [NSURL URLWithString:@"file:///Users/babylon/Desktop/code/day9_oc/day09/day09/haowai.txt"];

    NSString * str = @"最新消息,最新消息:刘铁柱暴打王大锤不成,王大锤反杀刘铁柱!!";

    //- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
    //向 NSURL 对象保持的地址写入字符串数据.
    
    BOOL res = [str writeToURL:u1 atomically:NO encoding:NSUTF8StringEncoding error:&err];
    
    //第一种判断方式:
    NSLog(@"%@",res==YES?@"写入成功!":@"写入失败!");
    
    //第二种判断方式:
    if (err != nil) {
        NSLog(@"%@",err.localizedDescription);
    }
    else{
        NSLog(@"写入成功!");
    }

  4. 字符串比较.

- (NSComparisonResult)compare:(NSString *)string;
    NSString *str1 = @"王大锤";
    NSString *str2 = @"刘铁柱";
    
    //- (NSComparisonResult)compare:(NSString *)string;
    // (对象方法) 字符串比较.

   NSComparisonResult res =  [str1 compare:str2];
    
    //typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};
    
    switch (res) {
        case NSOrderedAscending:
            //说明str1比str2小
            NSLog(@"小");
            break;
        case NSOrderedDescending:
            //说明str1比str2大
            NSLog(@"大");
            break;
        case NSOrderedSame:
            NSLog(@"相等");
            //说明相等
            break;
    }
    

   5. 字符串比较:忽略大小写的比较:

- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
    NSString *str1 = @"Jack";
    NSString *str2 = @"jack";
    
    //- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
    // (对象方法) 字符串比较(带选项).

   NSComparisonResult res =  [str1 compare:str2 options:NSCaseInsensitiveSearch];

    //Case Insensitive 不区分大小写

    switch (res) {
        case NSOrderedAscending:
            //说明str1比str2小
            NSLog(@"小...");
            break;
        case NSOrderedDescending:
            //说明str1比str2大
            NSLog(@"大....");
            break;
        case NSOrderedSame:
            NSLog(@"相等...");
            //说明相等
            break;
    }
typedef NS_OPTIONS(NSUInteger, NSStringCompareOptions) {
    NSCaseInsensitiveSearch = 1, //不区分大小写
    NSLiteralSearch = 2,		/* 逐个字符精确比对 */
    NSBackwardsSearch = 4,		/* Search from end of source string */
    NSAnchoredSearch = 8,		/* Search is limited to start (or end, if NSBackwardsSearch) of source string */
    NSNumericSearch = 64,		/*字符串里面数字的比较*/
    NSDiacriticInsensitiveSearch NS_ENUM_AVAILABLE(10_5, 2_0) = 128, /* If specified, ignores diacritics (o-umlaut == o) */
    NSWidthInsensitiveSearch NS_ENUM_AVAILABLE(10_5, 2_0) = 256, /* If specified, ignores width differences ('a' == UFF41) */
    NSForcedOrderingSearch NS_ENUM_AVAILABLE(10_5, 2_0) = 512, /* If specified, comparisons are forced to return either NSOrderedAscending or NSOrderedDescending if the strings are equivalent but not strictly equal, for stability when sorting (e.g. "aaa" > "AAA" with NSCaseInsensitiveSearch specified) */
    NSRegularExpressionSearch NS_ENUM_AVAILABLE(10_7, 3_2) = 1024    /* Applies to rangeOfString:..., stringByReplacingOccurrencesOfString:..., and replaceOccurrencesOfString:... methods only; the search string is treated as an ICU-compatible regular expression; if set, no other options can apply except NSCaseInsensitiveSearch and NSAnchoredSearch */
};

比较字符串内的数值的大小(一般用来比较带序号的路径)

 

  7. 判断字符串是否以指定的字符串开头

     - (BOOL)hasPrefix:(NSString *)str;
    NSString * str = @"http://www.csdn.com/";
    
    //- (BOOL)hasPrefix:(NSString *)str;
    //方法对象 是否以指定字符串开头

    BOOL res = [str hasPrefix:@"http://"];
    
    if (res == NO ) {
        res = [str hasPrefix:@"https://"];
    }
    
    NSLog(@"%@",res == YES?@"字符串是网址":@"字符串不是网址");
    

  8. 判断字符串是否以指定的字符串结尾

- (BOOL)hasSuffix:(NSString *)str;
    NSString *path = @"/Users/Apple/Download/王大锤大战刘铁柱.avi";
    
    //- (BOOL)hasSuffix:(NSString *)str;
    //方法对象 是否以指定的字符串结尾
    BOOL res = [path hasSuffix:@".mp3"];
    NSLog(@"%@",res == YES?@"文件后缀是mp3":@"文件后缀不是mp3");
    
    

  9. 在主串中搜索子串.从前往后

- (NSRange)rangeOfString:(NSString *)searchString;

    NSString *str = @"刘铁柱表示:王大锤大战刘铁柱将在下周五播出!";
    //- (NSRange)rangeOfString:(NSString *)searchString;
    
    NSRange range  = [str rangeOfString:@"刘铁柱"];
    /*
     typedef struct _NSRange {
     NSUInteger location; //子串在主串中首次出现的下标
     NSUInteger length;   //子串在主串中匹配的长度
     } NSRange;
     */
    NSLog(@"%@",range.length == 0 ?@"没找到字符串":@"已找到字符串" );
    
    NSLog(@"location = %lu location = %lu",range.location,range.length);

      返回值是1个NSRange类型的结构体变量.

     typedef struct _NSRange {

         NSUInteger location; //代表子串在主串出现的下标.

         NSUInteger length; //代表子串在主串中匹配的长度.

     } NSRange;

     如果没有找到:

     location 为NSUInteger的最大值, 也就是NSNotFound

     length 的值为0

     这个方法,是从前往后搜索. 第1次匹配的子串.

    NSString *str = @"刘铁柱表示:王大锤大战刘铁柱将在下周五播出!";
    //- (NSRange)rangeOfString:(NSString *)searchString;
    
    NSRange range  = [str rangeOfString:@"!刘铁柱!"];
    /*
     typedef struct _NSRange {
     NSUInteger location; //子串在主串中首次出现的下标
     NSUInteger length;   //子串在主串中匹配的长度
     } NSRange;
     */
    
    
    if (range.location == NSNotFound)
        //static const NSInteger NSNotFound = NSIntegerMax;
        //9223372036854775807
    {
        NSLog(@"没有找到字符串~");
    }
    else{
        NSLog(@"已找到字符串");
    }
    
    NSLog(@"%@",range.length == 0 ?@"没找到字符串":@"已找到字符串" );
    
    
    NSLog(@"location = %lu location = %lu",range.location,range.length);
    
    return 0 ;
}

  10.在主串中搜索子串.从后往前.

- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask;
    NSString *str = @"刘铁柱表示:王大锤大战刘铁柱将在下周五播出!";
    //- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask;
    // 在主串中搜索子串 -> 从后往前(NSBackwardsSearch).
    NSRange range  = [str rangeOfString:@"刘铁柱" options:NSBackwardsSearch];
    
    
    if (range.location == NSNotFound)
    {
        NSLog(@"没有找到字符串~");
    }
    else{
        NSLog(@"已找到字符串");
    }

    NSLog(@"location = %lu location = %lu",range.location,range.length);

 11. NSRange结构体.

     1). 是Foundation框架中定义的1个结构体.

         typedef struct _NSRange {

            NSUInteger location;

            NSUInteger length;

         } NSRange;

         NSRange range;

         这个结构体变量一般情况下用来表示1段范围.特别用在子串在主串中的范围表示.

        @"hahajackhehe" @"jack" 

         4  4

        NSRange range = {4, 4};

    2). 声明并初始化结构体变量的方式.

        1). 最原始的方式.

NSRange range;
range.location = 3;
range.length = 4;

        2). 第二种方式:   

NSRange range = {3, 7};

        3). 第三种方式:  

NSRange range = {.location = 3,.length = 7};

        4). Foundation框架中定义了1个函数.这个函数可以快速的创建1个NSRange结构体会,           

NSRange range =  NSMakeRange(loc, len);

            返回1个指定属性的NSRange结构体变量.

        5). Foundation框架中定义了1个函数 可以将1个NSRange结构体变量转换为NSString

             NSStringFromRange(ran) 函数可以将NSRange结构体变量转换为指定格式的字符串.

05-字符串的常用成员

  1. 字符串的截取.

     取到字符串中的1部分.

    1.1 (对象方法)从指定的下标出一直截取到最后。

- (NSString *)substringFromIndex:(NSUInteger)from;
    NSString * str = @"板凳宽扁担长,扁担非要绑在板凳上,板凳不让扁担绑在板凳上";
    NSString * newStr = str;
    NSUInteger i = 0 ;
    int x = 0;
    do
    {
        NSRange range = [newStr rangeOfString:@"扁担"];
        if (range.length != 0)
        {
            x++ ;
            i = i + range.location; //要搜索的文字出现的位置
            NSLog(@"第[%d]次出现,下标为%lu",x,i);
            i = i + range.length;  //要截取掉前面的文字数
            
            //- (NSString *)substringFromIndex:(NSUInteger)from;
            //(对象方法)从指定的下标出一直截取到最后.
            newStr = [str substringFromIndex: i];
            
        }
    }
    while (str.length != 0);
    NSLog(@"扁担在字符串中出现的次数为:%d", x );

 1.2     从第0个开始截取指定的个数

- (NSString *)substringToIndex:(NSUInteger)to; 从第0个开始截取指定的个数.
    NSString * str = @"板凳宽扁担长,扁担非要绑在板凳上,板凳不让扁担绑在板凳上";
    
    //- (NSString *)substringToIndex:(NSUInteger)to;
    //(对象方法) 从第0个开始截取指定的个数.
    
    NSLog(@"%@",[str substringToIndex:6]);
    

 1.3   截取指定的1段范围.

- (NSString *)substringWithRange:(NSRange)range; 
    NSString * str = @"板凳宽扁担长,扁担非要绑在板凳上,板凳不让扁担绑在板凳上";
    
    //- (NSString *)substringWithRange:(NSRange)range;
    //截取指定的1段范围.
    
    NSLog(@"%@",[str substringWithRange:NSMakeRange(7, 9)]);

 

2. 字符串的替换

- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement NS_AVAILABLE(10_5, 2_0);

/* Replace characters in range with the specified string, returning new string.
*/

        将字符串中第1个参数替换为第2个参数.

        友情提示: 原来的指针指向字符串的内容是不会变的,会全部替换.

        新串是以方法的返回值返回的. 

    NSString * str = @"板凳宽扁担长,扁担非要绑在板凳上,板凳不让扁担绑在板凳上";
    
    //- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement NS_AVAILABLE(10_5, 2_0);
    
    // Replace characters in range with the specified string, returning new string.
    
    //将字符串中第1个参数替换为第2个参数.返回一个新的字符串
    NSString * newStr = [str stringByReplacingOccurrencesOfString:@"扁担" withString:@"刘铁柱"];
    
    NSLog(@"%@", newStr);

         这个方法还可以做删除. 原理: 将其替换为@""

   3. 字符串数据转换为其他的类型. 使用频率很高.

     @property (readonly) double doubleValue; 

     @property (readonly) float floatValue;

     @property (readonly) int intValue;

     @property (readonly) NSInteger integerValue

     @property (readonly) long long longLongValue

     @property (readonly) BOOL boolValue

     转换注意. 从头开始转换,能转换多少就是多少. 到遇到不能转换的时候就停止转换.

  4. 去掉字符串前后的空格/大/小写字母/去掉指定字符串等.

        4.1 去掉字符串前后空格(中间的空格无法去掉.)

- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
    NSString * str = @"      (_刘铁柱 锤爆 王大锤_)     ";
    //- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
    //NSCharacterSet
    // whitespaceCharacterSet 删除字符串前后空格
    

    NSString * newStr =
    [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    
    
    //characterSetWithCharactersInString 自定义删除的字符,包含在字符串里的就会删除
    NSString * newStr1 =
    [newStr stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"@/:();()¥「」"、[]{}#%-*+=_\\|~<>$€^•'@#$%^&*()_+'\""]];
    
    NSLog(@"处理前:[%@]",str);
    NSLog(@"删除空格处理后:[%@]",newStr);
    NSLog(@"去除符号处理后:[%@]",newStr1);

         4.2 去掉字符串前后的小写字母

参数:lowercaseLetterCharacterSet

   NSString * str = @"abcabc  I love U abcabc";
    //- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
    
    //lowercaseLetterCharacterSet 去掉字符串前后小写字母
    NSString * newStr =
    [str stringByTrimmingCharactersInSet:[NSCharacterSet lowercaseLetterCharacterSet]];
    

    NSLog(@"处        理          前:[%@]",str);
    NSLog(@"删除字符串前后小写字母处理后:[%@]",newStr);
    
    return 0 ;

        4.3  去掉字符串前后的大写字母

        参数:uppercaseLetterCharacterSet

    NSString * str = @"ABC I love U ABC";
    //- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
    
    //uppercaseLetterCharacterSet 去掉字符串前后大写字母
    NSString * newStr =
    [str stringByTrimmingCharactersInSet:[NSCharacterSet uppercaseLetterCharacterSet]];
    

    NSLog(@"处        理          前:[%@]",str);
    NSLog(@"删除字符串前后大写字母处理后:[%@]",newStr);

 4.4 去掉字符串前后指定的字符串

参数:characterSetWithCharactersInString 去掉字符串前后特定字符(设置字符串内包含的字符)

    NSString * str = @"(_@ I love U @_)";
    //- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
    
    //characterSetWithCharactersInString 去掉字符串前后特定字符(设置字符串内包含的字符)
    NSString * newStr =
    [str stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"@/:();()¥「」"、[]{}#%-*+=_\\|~<>$€^•'@#$%^&*()_+'\""]];
    
    

    NSLog(@"处        理          前:[%@]",str);
    NSLog(@"删除字符串前后特定字母处理后:[%@]",newStr);

 5.将字符串转换为大写/小写字符串

    @property (readonly, copy) NSString *uppercaseString;
    @property (readonly, copy) NSString *lowercaseString;

属性:uppercaseString        字符串内字母全部转换大写

属性:lowercaseString        字符串内字母全部转换小写

属性: capitalizedString        字符串内每个单词字母首字母大写,其它字母小写。

    NSString * str = @"I love U";

    //@property (readonly, copy) NSString *uppercaseString;
    //@property (readonly, copy) NSString *lowercaseString;

    NSString *upper = str.uppercaseString;
    NSString *lower = str.lowercaseString;
    
    NSLog(@"%@转换大写后%@",str,upper);
    NSLog(@"%@转换小写后%@",str,lower);

    NSString * str = @"Administrators, commonly known as admins or sysops (system operators), are Wikipedia editors who have been granted the technical ability to perform certain special actions on the English Wikipedia. These include the ability to block and unblock user accounts, IP addresses, and IP ranges from editing, edit fully protected pages, protect and unprotect pages from editing, delete and undelete pages, rename pages without restriction, and use certain other tools.";
    
    NSString * lower = str.lowercaseString;
    NSString * upper = str.uppercaseString;
    

    NSLog(@"%@ \n 单词首字母大写后:%@", lower,lower.capitalizedString);
    NSLog(@"%@ \n 单词首字母大写后:%@",upper,upper.capitalizedString);

06-NSMutableString

  1. 字符串的恒定性.

     一旦创建1个字符串对象,那么这个字符串对象的内容就无法更改, 当我们修改字符串的时候,   其实是重新的创建了1个字符串对象.

     代码案例:

NSLog(@"-------------------");
NSString *str = @""; //@""
for(int i = 0; i < 50000; i++)
{
    str = [NSString stringWithFormat:@"%@%d",str,i];
}
NSLog(@"-------------------");

     会耗费很长的时间. 每次循环的时候 都会创建1个新的字符串对象.50000个,

     因为字符串的恒定性.

 2. 如何让这样的大批量的字符串拼接可以更加快速的1点.

    1). 慢得原因: 因为字符串的恒定性,每次修改字符串的时候,是重新的创建1个对象,

    2). 希望: 有没有一种对象是用来存储字符串的,并且存储在这个对象中的字符串数据可以更改.

 3. NSMutableString

    1). 是Foundation框架中的1个类.从NSString继承.

        所以,NSMutableString对象是用来存储字符串数据的.

    2). NSMutbaleString在父类NSString的基础之上的做扩展.

        存储在NSSMutableString对象中的字符串数据可以更改.具备可变性.

        直接可以改存储在NSMutableStirng对象中的字符串数据,不会新创建对象.

 4. NSMutableString的用法

       1). 既然是1个类,要使用的话,就得创建1个对象.

NSMutableString *str = [NSMutableString string];

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

- (void)appendString:(NSString *)aString;  //直接追加内容.

- (void)appendString:(NSString *)aString;  //直接追加内容.

      - (void)appendFormat:(NSString *)format, ... 以拼接的方式往可变字符串对象中追加内容.

- (void)appendFormat:(NSString *)format, ... //以拼接的方式往可变字符串对象中追加内容.
    NSMutableString * str = [NSMutableString string];
    int age = 10;
    [str appendFormat:@"我叫%@,我今年%d岁",@"jack",age];
    NSLog(@"%@",str);
    return 0 ;

    3). 创建NSMutableString对象的时候,记住下面这样的初始化方式是不行的.

        NSMutableString *str = @"jack";

        @"jack" 是1个NSString对象,是1个父类对象.

        而str指针是1个NSMutableString类型的 是1个子类类型的.       

        如果通过子类指针去调用子类独有的成员 就会运行错误.

    4). NSMutableString从NSString继承.

        在使用NSString的地方完全可以使用NSMutableString

  5. 使用NSMutableString来做大批量的字符串拼接.

     NSLog(@"~~~~~~~~~~~~");
     NSMutableString *str = [NSMutableString string];
     for(int i = 0; i < 100000; i++)
     {
        [str appendFormat:@"%d",i];
     }
     NSLog(@"~~~~~~~~~~~~");

    这个时候 "biu"的一下就结束了. 为什么这么快>? 因为NSMutableString只有1个.每次修改的时候 直接修改的是这个对象中的数据.

 6. 使用建议

    1). 我们平时使用的时候,还是使用NSString. 因为效率高.

        NSString *str1 = @"jack";

        NSString *str2 = @"jack";

    2). NSMutbaleString: 只在做大批量的字符串拼接的时候才使用.

        大量拼接的时候,就不要去使用NSString 因为效率低下.(10次以上.)

07-NSArray

  1. 回忆C语言中的数组

     特点:

     a. 存储多个数据.

     b. 类型相同.

     c. 长度固定.

     d. 每1个元素都是紧密相连的.

  2. NSArray

     1). 是Foundation框架中的一个类.这个类的对象是来存储多个数据的,具备数组的功能.

         所以,NSArray是OC中的数组.

     2). 特点:

         a. 只能存储OC对象.任意的OC对象 (无法存储非OC对象的数据)

         b. 长度固定. 一旦NSArray数组创建完毕之后,元素的长度固定,无法新增 无法删除元素.

         c. 每1个元素都是紧密相连的. 每1个元素仍然有自己的下标.

         d. 元素的类型是id类型的.

  3. NSArray数组的创建.

     1). 因为这是1个类,所以当然就是创建NSArray对象.

         NSArray *arr1 = [NSArray new];
         NSArray *arr2 = [[NSArray alloc] init];
         NSArray *arr3 = [NSArray array];

         这样创建出来的NSArray数组的元素的个数是0个,因为长度固定.所以没有任何意义.

     2). 创建数组的同时指定1个数组的元素

+ (instancetype)arrayWithObject:(ObjectType)anObject;

NSArray *arr = [NSArray arrayWithObject:@"jack"];

        仍然没有意义,因为这个数组中只有1个元素.

     3). 最常用的创建NSArray数组的方式.

+ (instancetype)arrayWithObjects:(ObjectType)firstObj, ...
//+ (instancetype)arrayWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;

NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];

         使用注意

         1). 只能存储OC对象.不能存储非OC对象.

         2). 将元素写完以后,最后要写1个nil 表示元素到此结束了.

    4). 创建NSArray数组的简要方式.

         NSArray *arr = @[写上每1个元素的值用逗号分隔.];

NSArray * arr = @[@"王大锤",@"刘铁柱",@"Tom",@"Jerry"];

         注意:  这种创建方式 不需要在最后加nil.

   4. NSArray数组的使用.

      1). 在NSLog函数中使用%@可以直接输出NSArray对象中的所有的元素的值.

       2). NSArray数组中不能存储基本数据类型.不能存储非OC对象.

          nil的本质其实就是0 所以nil无法存储到NSArray数组中.

     3). 这样创建数组没有任何意义.

             NSArray *arr1 = [NSArray new];
             NSArray *arr2 = [[NSArray alloc] init];
             NSArray *arr3 = [NSArray array];

          这些数组是没有元素的 而NSArray数组元素无法新增和删除,所以没有任何意义. 

  5. 取出存储在NSArray数组中的元素的值.

     1). 可以使用下标取出对应的元素的值.

NSArray *arr = @[@"jack",@"rose",@"lili"];        
NSLog(@"%@",arr[0]);
NSLog(@"%@",arr[1]);
NSLog(@"%@",arr[2]);

          如果下标越界 就直接运行报错.

     2). 调用数组对象的对象方法来取出指定下标的元素的值. 

- (ObjectType)objectAtIndex:(NSUInteger)index;
    NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
    //- (ObjectType)objectAtIndex:(NSUInteger)index;
    // 取出指定下标的元素的值
    NSLog(@"%@",[arr objectAtIndex:1]);

         

   6. NSArray数组的其他的常用方法

     1). 得到NSArray数组中的元素的个数.

@property (readonly) NSUInteger count;
    NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
    
    //@property (readonly) NSUInteger count;
    NSLog(@"%lu",arr.count);

     2). 判断NSArray数组中是否包含指定的元素.

- (BOOL)containsObject:(ObjectType)anObject;
    NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
    
    //- (BOOL)containsObject:(ObjectType)anObject;
    BOOL res = [arr containsObject:@"Tom"];
    NSLog(@"%@",res == YES ?@"包含元素":@"不包含元素");

     3). 取到NSArray数组中的第1个元素.

@property (nullable, nonatomic, readonly) ObjectType firstObject
NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
//@property (nullable, nonatomic, readonly) ObjectType firstObject NS_AVAILABLE(10_6, 4_0);
NSLog(@"第一个元素:%@",arr.firstObject);

         与arr[0]的区别:

         如果数组中没有任何元素.arr[0]报错. firstObject取到nil 不报错.

     4). 取到NSArray数组中的最后1个元素.

@property (nullable, nonatomic, readonly) ObjectType lastObject
NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
//@property (nullable, nonatomic, readonly) ObjectType lastObject;
NSLog(@"最后一个元素:%@",arr.lastObject);

      5). 查找指定的元素在NSArray数组中第一次出现的下标.

- (NSUInteger)indexOfObject:(ObjectType)anObject;
    NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
    
    //- (NSUInteger)indexOfObject:(ObjectType)anObject;
    NSUInteger res = [arr indexOfObject:@"Tom"];
    NSLog(@"%@",
          res != NSNotFound ? [NSString stringWithFormat:@"元素下标:%lu",res]:@"未找到元素");

          如果没有找到 返回的是NSUInteger的最大值(NSNotFound).

  7. NSArray数组的遍历.

     1). 使用for循环来遍历数组中的每1个元素.

         原理: 将下标挨个挨个遍历出来 取值.

    NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
    for (int i = 0; i < arr.count; i++) {
        //NSLog(@"[ %d ]= %@ ",i,arr[i]);
        NSLog(@"[ %d ]= %@ ",i,[arr objectAtIndex:i]);
    }

    2). 使用增强for循环来遍历NSArray数组中的元素.

         a. 语法格式:

            for(元素类型 变量名 in 数组名)

            {

                直接通过变量名就可以拿到数组中的每1个元素.

            }

NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
for(NSString * str in arr)
{
    NSLog(@"%@",str);
}

         b. 声明在for()中的变量叫做迭代变量.

         c. 执行的原理.  

            将数组中的第1个元素的值赋值给迭代变量.执行循环体.   

            将数组中的第2个元素的值赋值给迭代变量.执行循环体. 

            将数组中的第3个元素的值赋值给迭代变量.执行循环体.   

            .......

            将数组中的最后1个元素的值赋值给迭代变量.执行循环体.   

            结束循环.

         d. 语法总结:

            -> 迭代变量的类型和数组中的元素的类型保持一致.

            -> 迭代变量的名称可以任意取,根据自己的爱好.

            -> in是固定的.

            -> 遍历哪1个数组,就将数组写在in后面.

            -> 循环体里面.迭代变量的值就是元素的值.

          当NSArray数组中存储的数据的类型不一致时候 迭代变量的类型建议使用id类型.

     3). 使用block遍历.

- (void)enumerateObjectsUsingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);

         这是1个方法.这个方法的作用就是来遍历数组中的每1个元素.

    NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
    
    //- (void)enumerateObjectsUsingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);
    //方法:遍历数组中的每个元素。
    
    [arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop)
    {
        NSLog(@"%@",obj);
    }];

         如果想停止遍历,就将第三个参数*STOP改成YES就可以了。

8. NSArray与字符串的两个方法

     1). 将数组中的元素连接起来组成1个新的字符串.

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

         参数: 连接符.

    NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
    //- (NSString *)componentsJoinedByString:(NSString *)separator;
    //将数组中的元素连接起来组成1个新的字符串. [参数]separator = 连接符
    
    NSString * str = [arr componentsJoinedByString:@"-"];
    
    NSLog(@"%@",str);
    

      2). 将字符串以指定的分隔符分成1个数组. 每1部分就是数组的1个元素.      

- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
    NSString * str = @"王大锤-刘铁柱-Tom-Jerry";
    //- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
    //方法 - 将字符串以指定的分隔符分成1个数组. 每1部分就是数组的1个元素.[参数]separator = 分隔符
    NSArray * arr =  [str componentsSeparatedByString:@"-"];
    
    [arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"[%lu]%@ [lenth] %lu", idx , obj , [obj length]);
        
    }];

08-description

  1. 非常重要的问题

     %p : 打印的是指针变量的值.

     %@ : 打印的是指针变量指向的对象.

  2. 使用NSLog函数 %@ 打印对象的原理.

     1). 调用传入的对象的description方法.

         description是定义在NSObject协议中的1个方法.因为NSObject类遵守了NSObject协议.

         所以,NSObject类中就有这个description方法的实现.

         所以.所有的OC对象中都有description方法

         这个方法的返回值是NSString字符串.

     2). 取到description方法的返回值,然后输出返回值的内容.

     3)  description方法是NSObject类中实现的.

         在NSObject类中的description方法是如何实现的呢?

         实现: 返回如下格式的字符串

              @"<对象所属的类名:对象的地址>"

     4). 如果我们自定义的类不想打印NSObject中description方法的返回值.

         而是我自己定义的额.

         这个时候只需要子类重写父类的description方法

09-NSMutbaleArray

  1. NSMutableArray是NSArray的子类.

     1). NSMutableArray仍然是1个数组.具备NSArray数组的特点.

         只能存储OC对象.每1个元素的紧密相连的.

     2). NSMutableArray相对于父类做的扩展:NSMutableArray数组的元素可以动态的新增和删掉.

         其他的用法均与NSArray一致.

         所以: NSArray数组一旦创建,其元素的个数就固定,无法新增删除.

              NSMutableArray数组.元素可以新增 可以删除. 其他用法和父类一样.

  2.NSMutableArray数组的创建.

    NSMutableArray * arr1 = [NSMutableArray array];
    NSMutableArray * arr2 = [[NSMutableArray alloc]init];
    NSMutableArray * arr3 = [NSMutableArray new];
    NSMutableArray * arr4 = [NSMutableArray arrayWithObject:@"王大锤"];

     这样创建出来的数组对象.数组的元素是0 仍然是有意义的 因为我们可以动态的新增和删除元素.

     也可以使用这样的方式来创建可变数组对象.这个数组的元素可以新增和删除.

NSMutableArray * arr5 = [NSMutableArray arrayWithObjects:@"王大锤",@"刘铁柱",nil];

     最容易犯错:这样写是不可以的

NSMutableArray *arr5 = @[@"jack",@"rose",@"lili"];

     @[@"jack",@"rose",@"lili"];这是1个NSArray对象.

     arr5是1个子类指针. 子类指针指向父类对象的就有可能会出问题.

 ---------插入---------

 1. 任意的指针其实可以指向任意的对象.  编译不会报错 只会给1个警告.

 2. 虽然语法上可以乱指.但是你千万别乱指.因为运行的适合可能出错.

    当我们调用指针类型特有的方法的时候.

 -------------------------

 3.  可变数组中新增元素. 将传入的参数作为数组的元素添加进去.

- (void)addObject:(ObjectType)anObject; 

 4.  将另外1个数组中的每1个元素添加到可变数组中.

- (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;

 5. 在可变数组中指定的下标出插入1个元素.

- (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
    NSMutableArray * arr = [NSMutableArray array];

    NSArray * arr1 =@[@"Jack",@"Rose",@"Lili",@"Tom",@"Jerry"];
    
    // - (void)addObject:(ObjectType)anObject;
    [arr addObject:@"王大锤"];
    NSLog(@"1.当前元素数:%lu",arr.count);
    NSLog(@"%@",arr);
    NSLog(@"----------------------------------");
    
    // - (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;
    [arr addObjectsFromArray:arr1];
    NSLog(@"2.当前元素数:%lu",arr.count);
    NSLog(@"%@",arr);
    NSLog(@"----------------------------------");
    
    // - (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
    [arr insertObject:@"刘铁柱" atIndex:1];
    NSLog(@"3.当前元素数:%lu",arr.count);
    NSLog(@"%@",arr);
    NSLog(@"----------------------------------");
    

--------------

 6. 删除可变数组中指定下标的元素.

- (void)removeObjectAtIndex:(NSUInteger)index;

 7. 删除可变数组中所有的指定的元素.

- (void)removeObject:(ObjectType)anObject;

​​​​​​8. 删除最后1个元素   

- (void)removeLastObject;

 9.   替换指定下标元素的值

- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(ObjectType)anObject;

 10.删除所有的元素

- (void)removeAllObjects
   NSMutableArray * arr = [NSMutableArray arrayWithObjects:@"Jack",@"Rose",@"孙大宝",@"刘铁蛋",@"Lili",@"Tom",@"Jerry",@"刘铁蛋",nil];
    
    // - (void)removeObjectAtIndex:(NSUInteger)index; 删除指定下标的元素
    NSLog(@"------------删除下标为2的元素【孙大宝】----------");
    [arr removeObjectAtIndex:2];
    NSLog(@"1.当前元素数:%lu\n%@\n----------------------------------",arr.count,arr);
    
    // - (void)removeObject:(ObjectType)anObject; 删除所有的指定的元素.
    NSLog(@"----------删除所有为【刘铁蛋】的元素-------------");//控制显示为:\U5218\U94c1\U86cb
    [arr removeObject:@"刘铁蛋"];
    NSLog(@"2.当前元素数:%lu\n%@\n----------------------------------",arr.count,arr);

    //- (void)removeLastObject;    //删除最后一个元素
    NSLog(@"------------删除最后一个元素【Jerry】-----------");
    [arr removeLastObject];
    NSLog(@"4.当前元素数:%lu\n%@\n----------------------------------",arr.count,arr);
    
    // - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(ObjectType)anObject;
    //方法 替换指定下表元素的值
    NSLog(@"--------将【Lili】替换成【Luckey】-------------");
    [arr replaceObjectAtIndex:2 withObject:@"Luckey"];
    NSLog(@"5.当前元素数:%lu\n%@\n----------------------------------",arr.count,arr);
    
    //- (void)removeAllObjects;   删除所有的元素.
    NSLog(@"------------删除全部元素----------------------");
    [arr removeAllObjects];
    NSLog(@"6.当前元素数:%lu\n----------------------------------",arr.count);

  8. 删除指定范围中的所有指定元素.

- (void)removeObject:(ObjectType)anObject inRange:(NSRange)range;
    NSMutableArray * arr = [NSMutableArray arrayWithObjects:@"Jack",@"Rose",@"刘铁柱",@"Lili",@"刘铁柱",@"Tom",@"刘铁柱",@"Jerry",nil];
    
    NSLog(@"==============原始数组====================");
    [arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"arr[%lu] = %@",idx,obj);
    }];

    
    //下标2,4,6 都是刘铁柱,我们要删除第4,第6个。
    NSRange range  = NSMakeRange(4,3);//(4,5,6)从下标4起,连续3个元素的范围
    
    //- (void)removeObject:(ObjectType)anObject inRange:(NSRange)range;
    // 删除指定范围中的所有指定元素.
    [arr removeObject:@"刘铁柱" inRange:range];

    NSLog(@"==============范围删除后==================");
    [arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"arr[%lu] = %@",idx,obj);
    }];

10-NSNumber

  1. 无论是NSArray还是NSMutbaleArray里面都只能存储OC对象.

     基本数据类型是无法存储的.

  2. 如何将基本数据类型的数据存储到NSArray数组中.

  3. 自定义包装类来包装基本数据类型.

    定义1个类,这个类的对象的作用是用来存储1个int类型的数据.再将这个对象存储到NSArray数组中.

  4. NSNumber是Foundation框架中定义好的1个类.这个类的对象的作用就是用来包装基本数据类型的.

     将基本数据类型存储到NSArray数组中的步骤.

     1). 先讲基本数据类型包装到NSNumber对象中.

     2). 再将NSNumber对象存储到NSArray数组中.

NSNumber *number1 = [NSNumber numberWithFloat:10.1f];
NSNumber *number2 = [NSNumber numberWithFloat:10.2f];
NSNumber *number3 = [NSNumber numberWithFloat:10.3f];
NSArray *arr = @[number1,number2,number3];
for(NSNumber *num in arr)
{
    NSLog(@"%f",num.floatValue);
}
    NSNumber * num1 = [NSNumber numberWithInt:10];
    NSNumber * num2 = [NSNumber numberWithFloat:10.15f];
    NSNumber * num3 = [NSNumber numberWithDouble:15.48457];
    
    NSArray * arr = @[num1,num2,num3];
    
    NSLog(@"%@",arr);
    
    [arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"[%lu]%@",idx,obj);
    }];
    
    for(NSNumber * num in arr)
    {
        NSLog(@"%d % .2lf  %f",num.intValue,num.floatValue,num.doubleValue);
    }

  5. 简写方式.

     创建NSNumber对象的简写方式:

    NSArray * arr = @[@10,@10.15f,@15.48457];
    
    NSLog(@"%@",arr);
    
    [arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"[%lu]%@",idx,obj);
    }];
    
    for(NSNumber * num in arr)
    {
        NSLog(@"%d % .2lf  %f",num.intValue,num.floatValue,num.doubleValue);
    }
    

     @10;  代表是1个NSNumber对象.这个对象中包装的是整形的10

           这个不是整形的10

[NSNumber numberWithInt:10];

     包装注意:

     如果后面的数据是1个变量 那么这个变量就必须要使用小括弧括起来.

     @(10);

int num = 10;
@(num)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值