OC不可变数组NSArray详解

1、NSSArray(子类NSMutableArray) 、NSSet(子类NSMutableSet)、 NSDictionary(子类NSMutableDictionary)这几个类都是集合类。
2、c语言类型的数组只能存放一种类型的数据。为此引入OC数组NSArray,以面向对象的方法操作数据,可以存放各种类型的对象。(只能存放OC对象,不能存放非OC对象类型,例如基本数据类型,结构体,枚举都不能存放)。
3、OC数组分类:OC数组也分为可变(NSArray) ,不可变(NSMutableArray)。 可变是指:数组内的数据可可以经数组操作进行改变。不可变数组是指:内容在创建数组的同时指定,数组创建以后以后将永远不可以再改变。例如 NSArray *array=[NSarray array] ;创建了一个没指定内容的空数组,那么array以后永远是空数组,永远无法改变。也就是说NSArray数组的元素必须在创建数组时就要进行初始化。
4、不可变数组NSArray的使用方式:
(1)使用类方法arrayWithObjects创建数组,举例如下:
NSArray *array=[NSArray arrayWithObjects:@“Jack”,@“rose”,nil];切记:使用arrayWithObjects方法时在最后一个对象的后面一定要加nil空指针。它是数组结束的标志,在nil之前的元素都是数组的内容。
(2)NSArray不可以存放空值即nil,nil只能有一个且只能放在末尾作为数组结束的标志。NSArray只可以存放OC对象类型。
(3)如果NSArray对象的内部只存放一个对象的话,结尾不用加nil指针作为结束标志,只有在存放两个以及多个对象数据时才加nil。
5、不可变数组NSArray自带的方法:
(1)返回存放的元素个数。NSArray对象可以调用自身的count方法返回数组自己内部对象数据的个数。可以用[NSArray对象 count]或NSArray对象.count 直接返回个数值。
(2)返回指定下标位置的对象。第一种方式可以用objectAtIndex方法。用[NSArray对象 objectAtIndex:位置下标]返回一个OC对象。第二种方式直接用C语言数组的格式 即NSArray对象[位置下标]
就可返回指定位置的对象,假设NSArray对象为array,array[4];
(3)根据对象返回下标位置。方法:indexOfObject:obj 即找出obj元素在数组中的下标。
(4)快速创建一个NsArray对象。用arrayWithObjects方法过于麻烦,可以直接用NSArray *array=@[@“Jack”,@“rose”,nil];代替即可,此种方式不需要加nil。注意若不用arrayWithObjects方法创建则不用加结束标志nil。
6、NSArray数组的遍历:
(1)一般方式:NSArray *array=@[@“Jom”,@“Rose”];
for(int i=0; i<array.count; i++){
NSLog(@“%@”,array[i]);
}
(2)快速遍历方式:
for(id obj in array){
NSLog(@“%@”,obj);
}
id obj代表着数组中的每一个元素,
注意:第二种方式缺点是不知道元素遍历的是第几次,若想知道当前遍历的元素是第几次,若想知道是第几次就要在外部初始化一个值为零的计数器进行内部计数或使用根据对象获取下标的方法。
如下所示:
int count=0;
for(id obj in array){
NSLog(@“%@”,);
}或
for(id obj in array){
NSUInteger i=[array indexOfObject: obj];
NSLog(@“%ld - %@”,i,obj);
}
(3)传入block方法遍历:用enumerateObjectsUsingBlock方法并传入一个block变量,直接编辑即可。如下所示:
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

}]
注意:每遍历一个元素,就会调用一次block,并且当前元素和索引位置元素当做参数传给block。obj:当前遍历的元素对象。idx:当前遍历元素的下标。stop:BOOL类型指针,当*stop被赋值为YES时,就会停止遍历,即

*stop=YES就相当于C语言for或switch中的break关键字。

7、全部打印对象元素:直接打印数组对象即可;即NSLog(@"%@",array); // array 为NSArray类型数组

代码验证,实例如下:

//
//  main.m
//  NSArrayExample
//
//  Created by apple on 15/8/20.
//  Copyright (c) 2015年 liu. All rights reserved.
//

#import <Foundation/Foundation.h>
void Test1()
{
    //   验证创建NSArray的方法
    //  方式1:使用arrayWithObjects
    NSArray *array1 = [NSArray arrayWithObjects:@"Jack",@"Tom",@"Jim", nil];
    NSArray *array2 = @[@"JACK",@"TOM",@"JIM"]; // 方式二
    
    //根据对象返回下标
    unsigned long int index1 = [array1 indexOfObject:@"Tom"];
    
    //   根据下标返回对象
    NSString *obj = [array2 objectAtIndex:2];
    
    //  返回元素的个数
    unsigned long int num=[array1 count]; //   或array.count
    NSLog(@"index1=%ld  obj=%@ num=%ld",index1,obj,num);
    
}
void Test2()
{//  NSArray的几种遍历方式
    NSArray *array=[NSArray arrayWithObjects:@"AAA",@"BBB",@"CCC", nil];
    
    //  第一种:普通方式
    for(int i=0;i<array.count;i++)
    {
        NSLog(@"i=%d %@",i,array[i]); // 或[array objectAtIndex: i];
    }
    NSLog(@"-------------------");
    //  第二种:快速遍历
    for(id obj in array){  // 获取下标方式一
        NSLog(@"index=%ld  %@",[array indexOfObject:obj],obj);
    }
    
    int count=0;
    for(id obj in array){ // 获取下标方式二
        NSLog(@"count=%d  %@",count,obj);
        count++;
    }
    NSLog(@"-------------------");
    // 第三种:传入块变量
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"id =%ld obj=%@ ",idx,obj);
        if (idx==1) {
            *stop=YES; // 终止遍历
        }
    }];
    NSLog(@"-------------------");
    NSLog(@"%@",array);  //打印所有对象元素
}
int main(int argc, const char * argv[])
{
    
    @autoreleasepool {
        Test1();
        Test2();
    }
    return 0;
}


运行结果如下:















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值