zoukankan      html  css  js  c++  java
  • IOS知识点总结 一 (NSArray)

    一:概述

      NSArray是不可变数组,一旦数组建立后,数组元素不能增加或删除,也就是不能改变数组的长度,而数组中的元素的值也不能修改,只能是最初创建的值。

      NSMutableArray是可变数组,它是NSArray的子类,它可以对数组元素进行增,删,改。

    二:创建数组的几个方法

    //c语言数组
    NSString *num[3]={@"first",@"second",@"third"};
            
    //创建数组 最后一个元素必须是nil
    NSArray *student = [NSArray arrayWithObjects:@"aaa",@"bbb",@"ccc",@"ddd",nil];
    
    //利用已创建的数组初始化        
    NSArray *stuCopy=[NSArray arrayWithArray:student];
            
    //利用c数组初始化
    NSArray *numCopy=[NSArray arrayWithObjects:num count:3];

       这几个方法创建的数组都是利用源数组初始化新的数组,新数组在内存中与源数组不在同一块区域

    三:数组常用的方法

      1.数组排序 (对数组执行排序操作,返回的是一个新的数组,对源数组中元素的排序没有影响)

     1 //创建元素字符串
     2 NSString *data=@"15,13,18,9,23";
     3 
     4 //字符串转数组
     5 NSArray *temp=[data componentsSeparatedByString:@","];
     6 
     7 //排序数组
     8 NSArray *array=[temp sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
     9            
    10             //将元素封装为可以按数字大小比较的NSNumber对象
    11             NSNumber *number1=[NSNumber numberWithInt:[obj1 intValue]];
    12             NSNumber *number2=[NSNumber numberWithInt:[obj2 intValue]];
    13 
    14             //进行比较
    15             NSComparisonResult result=[number1 compare:number2];
    16             
    17             //若obj1和obj2是降序排列,则返回结果为1,即源数组将按升序排列。
    18        return result == NSOrderedDescending;  //按升序排列
    19       // return result == NSOrderedAscending;   //按降序排列
    20         }]; 

       2.判断数组是否包含给定元素 。

        实现原理:利用-containsObject:(id)object这个方法,在方法中遍历整个数组,向每一个数组元素发送-isEqual:(id)object这个方法,若有某个元素的结果为TRUE,则返回YES,否则返回NO。

        -isEqual方法在判断NSString和NSNumber详解:

        -isEqual的方法在两个判断的对象指针相等的情况下则肯定是返回TRUE的,那么在指针不等而值相等的情况下有以下几种情况。

        (1)判断NSString的情况

          判断字符串是否相等的唯一条件就是字符串的hash值。所以只要字符串的值相等,不管指向它的指针是否相等,则判断结果就是TRUE。

          ps:NSString *str1=@"abc";

            NSString *str2=[NSString stringWithFormate:@"abc"];  

           str1在 常量区,而str2在堆区,两个字符串的指针不一样,但是字符串的值都是@"abc".那么 [str1 hash] == [str2 hash] .同样 [str1 isEqual:str2]的结果为TRUE。

        (2)判断NSNumber的情况

          首先是NSNumber在创建时的指针分配,NSnumber在创建时,如果用相同的方法创建,只要值相等,则返回内存中相同的指针。

          ps:NSNumber *number1=[NSNumber numberWithIntValue:1]; 

               NSNumber *number2=[NSNumber numberWithIntValue:1];

               则number1和number2指向的是内存中的相同区域,也就是number1 == number2.

          ps:NSNumber *number1=[NSNumber numberWithIntValue:1];

             NSNumber *number2=[NSNumber numberWithDouble:1.0];

             此时number1和number2的值不相等,number1 != number2。但是 [number1 hash] == [number2 hash]。同样[number1 isEqual:number2]结果为TRUE。

        所以-isEqual在判断NSString和NSnumber时,就直接考虑它的值是否相等,而不管这两个在内存中是否指向同一个对象

        (3)判断NSIndexPath的情况和上两种情况一样,只要两个对象的值相等,不管在内存中是否为同一个对象,用isEqual判等的结果为TRUE

        (4)在判断一般自定义类的情况,如果没有重写isEqual方法,则系统只简单的判断是否指针相等,即是否为内存中的同一个对象。若重写isEqual方法,则有一定的规定格式和要求。

        系统默认的判等:

      - (BOOL)isEqual: (id)other  
       {  
           return self == other;  
       }  
    
      - (NSUInteger)hash  
      {  
          return (NSUInteger)self;  
      }    

      3.枚举遍历数组

       -objectsEnumerator; //得到枚举对象 

         -reverseObjectEnumerator; //得到反向枚举对象

    // NSEnumerator示例
    NSArray *array = [NSArray arrayWithObjects:@"One",
    @"Two", @"Three", @"Four", nil];
    
    //生成枚举
    NSEnumerator *enumerator = [array objectEnumerator];
    
    //获取枚举对象
     id thing;
    while (thing = [enumerator nextObject]) 
    {
        NSLog(@"I found %@",thing);
     }

       快速枚举 for (type newVariable in expression){ //todo } , 快速枚举用到了修改监视器

    如果在枚举的过程中企图修改集合, 则会产生异常。 

      4.数组元素组合成字符串

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

           

  • 相关阅读:
    .NET平台下不借助Office实现Word、Powerpoint等文件的解析
    C#智能视频监控软件
    关于“线程”与“阻塞”
    asp.net 页面静态化
    纸上谈兵: 数学归纳法, 递归, 栈
    OSGI:C#如何实现简单的OSGI
    windows service (服务)创建流程
    轻松Scrum之旅——Sprint1:新手上路
    发布本人所有博客文章中涉及的代码与工具(大部分是C++和Java)
    多个常见代码设计缺陷
  • 原文地址:https://www.cnblogs.com/csdnmc/p/3953288.html
Copyright © 2011-2022 走看看