·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> objective-c系列-NSArray

objective-c系列-NSArray

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

OC数组NSArray

 

    对比         c数组              和       oc数组对象(指针)

  定义         int array[10];              NSArray *array;

  特点:        元素类型必须相同,         元素可以是任意对象

                 而且只能c的数据类型      但是不能是c的数据类型

  字面常量:  (数组类型){1,2,3}能     @[@"one",@"two"]

                 表达一个数组常量

  访问元素: array[i]                      ?

**********************************************

//oc数组对象的构造方法

//    NSArray * arr1 = [[ NSArray alloc]init]; //这种构造无意义

    NSArray * arr1 = [[ NSArray alloc]initWithObjects:@"one",@"two",@"three", nil];

    NSLog(@"arr1: %@ 地址:%p",arr1,arr1);

    

    NSArray * arr2 = [[ NSArray alloc]initWithArray:arr1];

    NSLog(@"arr2: %@ 地址:%p",arr2,arr2);

    

    

#define ARRAY1 @[@"one",@"two",@"three"]

//    NSArray * arr3 = @[@"one",@"two",@"four"];

    NSArray * arr3 = ARRAY1; //ARRAY1放在某一个常量区地址

    NSLog(@"arr3: %@",arr3);

    

    NSArray * arr4 = ARRAY1; //ARRAY1放在了另一个常量区的地址

    NSLog(@"arr3:%p, arr4:%p",arr3,arr4);

// 地址不同!!

**********************************************

// 类方法

  NSArray * arr1= [NSArray arrayWithObjects:@"one",@"two", nil];

    NSArray * arr2 =[NSArray arrayWithArray:arr1];

    NSArray *array = @[@"123",@"456",@"789",@"abc",@"def"];

**********************************************

//将数组里的所有字符串对象拼接成一个字符串对象并返回

    NSArray * array = @[@"there",@"is",@"a",@"girl" ];

    NSString * result = [array componentsJoinedByString:nil];

    

    NSLog(@"result: %@  长度为:%lu", result, [result length]);

**********************************************

//分割字符串,需要用到一个分割符字符串, 分割后的结果放在数组里

    NSString * str = @"there is a beautiful girl in my heart,but she is not my wife";

    NSArray * array = [str componentsSeparatedByString:@" "];

    NSLog(@"array: %@", array);

// 这样的话,heart,but就变成一个单词了,与我们的意图相悖

所以:

    NSCharacterSet *setSeparate = [NSCharacterSet characterSetWithCharactersInString:@", "];// 注意:@", "字符串包括一个@","和一个@" "!这和c中的拆分字符串方法很类似,可以添加多个拆分字符

    NSArray * aha = [str componentsSeparatedByCharactersInSet:setSeparate];

 

注意:当拆分字符或字符串在被拆分字符串中联系出现时,拆分后放到数组里的对象就会 有一个@"",空对象!

打印或者计数方法都会受影响,解决办法: [aha removeObject:@""];// 移除所有在数组中的@""对象

**********************************************

//在一个数组中查询某一个对象是否存在

    NSArray * array = @[@"one",@"two",@"three",@"four",@"two"];

    

    if ([array containsObject:@"one"]==YES)

    {

        NSLog(@"one在数组中存在");

        //    如果one在数组中存在,那么它肯定有一个下标,

        NSUInteger index = [array indexOfObject:@"one"];

        NSLog(@"one的下标为: %lu", index);

    }

    else

    {

        NSLog(@"one在数组中不存在");

    }

    //获取一个对象在数组中的下标,如果对象在数组中不存在,则返回NSNotFound

    if( [array indexOfObject:@"jobs"] == NSNotFound )

        NSLog(@"jobs 在数组中不存在");

**********************************************

// 访问元素

    NSArray * arr1 = @[@"one",@"two",@"three"];

    //用下标运算符访问某个元素

    NSLog(@"arr[1] is %@", arr1[1]);

    

    //调方法访问某个元素

    NSLog(@"objectAtIndex:1  == %@", [arr1 objectAtIndex:1]);

 

    //获取元素数量

    NSLog(@"arr1的元素个数为: %lu", [arr1 count]);

    

    //遍历数组对象

    //1,  用循环和下标运算符遍历

    NSUInteger i;

    for (i=0; i<[arr1 count]; i++) {

        NSLog(@"arr[%lu]=%@", i,arr1[i]);

    }

    //2,  用循环和方法objectAtIndex: 完成遍历

    for (i=0; i<[arr1 count]; i++) {

        NSLog(@"[arr1 objectAtIndex:%lu] == %@", (unsigned long)i, [arr1 objectAtIndex:i]);

    }

    

    //3,  快速枚举法

    for( id obj in arr1)    // for(int i=0;i<10;i++)

    {

        NSLog(@"快速枚举法:obj=[%@]",obj);

    }

    //4,枚举器法,  首先认识一种枚举器对象

    //               枚举器对象        这个方法是获取一个数组的枚举器

    //                                  正序枚举器

    NSEnumerator * enumerator =[arr1 objectEnumerator];

    id obj;

    while (obj = [enumerator nextObject]) {

        NSLog(@"正序枚举器法遍历: obj == %@", obj);

    }

    //                                     逆序枚举器

    NSEnumerator *enumerator2 = [arr1 reverSEObjectEnumerator];

   

    while (obj = [enumerator2 nextObject]) {

        NSLog(@"逆序枚举器法遍历: obj == %@", obj);

    }

**********************************************

//数组排序

 // 要回调的函数

NSInteger compareTwoObjects(id obj1, id obj2, void * args)

{

//    struct student * stu = args;

//    PRintf("args:%s\n",args);

    //1,比较字符串大小

//    return [obj1 compare:obj2];

    

    //2, 比较字符串的长度

    return [obj1 length]-[obj2 length];

    

    //3, 将字符串转成整型,再比较整型的大小

//    return [obj1 integerValue]-[obj2 integerValue];

}

 

 

    NSArray *array = [[ NSArray alloc]initWithObjects:@"123",@"4567",@"34",@"111", @"x",nil];

    //  对数组的元素进行排序: 传进来的是一个回调函数,用于处理比较细节

   NSArray * newArray =  [array sortedArrayUsingFunction: compareTwoObjects context:"testString"];

 

**********************************************

数组排序方法sortedArrayUsingFunction:context:在官方文档里有很详细的介绍,并且有相关例子可供参考

**********************************************