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 ;

 

       

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。